在PostgreSQL中,如何防止任何人(包括超級用戶)放棄某個特定的表?如何防止表被丟棄?
編輯:哇,我們在這裏有一些誤解。假設有一個大的共享QA數據庫。有時候人們會錯誤地運行像Hibernate生成的架構等破壞性的東西,而我正在尋找方法來防止這種錯誤。
在PostgreSQL中,如何防止任何人(包括超級用戶)放棄某個特定的表?如何防止表被丟棄?
編輯:哇,我們在這裏有一些誤解。假設有一個大的共享QA數據庫。有時候人們會錯誤地運行像Hibernate生成的架構等破壞性的東西,而我正在尋找方法來防止這種錯誤。
我不認爲你可以這樣做。你也許可以擁有超級用戶,他們將首先處理所有事情。或者經常備份,所以層次結構的更高層成員總是可以檢索表格。
您可以通過編寫重視ProcessUtility_hook
一些C代碼做到這一點。如果你從來沒有做過這樣的事情,它不會是微不足道的,但它是可能的。
另一個選擇可能是調查sepgsql,但我沒有任何經驗。
開源數據庫的好處的一個主要例子。 – Kuberchaun
編寫ProcessUtility_hook實際上並不難,但PostgreSQL 9.2和9.3定義之間存在差異,這意味着您需要單獨的擴展。這裏有一個基本的例子:https://github.com/ringerc/scrapcode/tree/master/postgresql/example_processutility_hook這裏有一個ProcessUtility鉤子,它確實有用:https://github.com/ringerc/postgres/blob/bdr -reject不安全的命令/的contrib/BDR/bdr_commandfilter.c –
超級用戶就是這樣。如果你不希望他們能夠放下東西,不要讓他們成爲超級用戶。
有沒有必要讓用戶幾乎作爲超級用戶運行有史以來。當然不是像模式遷移這樣的自動化工具。
您的應用程序應該以具有所需最小用戶權限的用戶身份進行連接。他們不應該使用擁有他們操作的表,所以他們不能對它們進行模式更改或刪除它們。
當你要進行架構更改,運行使用確實有感興趣的表的所有權,但不是超級用戶的應用程序。表所有者可以刪除和修改表,但只能刪除它擁有的表。
如果你真的,真的需要做一些超出標準權限模型,你需要寫一個ProcessUtility_hook
。有關這方面的一些細節,請參見this related answer。即使這樣,一個超級用戶也許可以通過加載一個可以跳過你的鉤子的擴展來解決它,你只需稍微放慢它們。
不要在生產環境中以超級用戶身份運行應用程序。永遠。
獲得更多指導見the PostgreSQL documentation on permissions使用的權限模型。
不要成爲像NSA那樣的邪惡公司。 –
@GilbertLeBlanc國家安全局不是一家公司,這不是邪惡。 – mitchfish36
阻止「運行hibernate生成的模式」的唯一方法是撤銷「常規」用戶的任何DDL特權,並且有專門的用戶來創建和管理數據庫中的對象。只有「DBA」(或負責管理對象的人)才能連接爲「對象所有者」並運行DDL語句。很多我們的客戶以這種方式限制了對數據庫的訪問(「應用程序用戶」只能運行DML,僅此而已)。這在大公司中並不罕見。 –