PostgreSQL:僅訪問視圖的登錄角色
我需要編寫一個必須執行以下操作的 SQL 文件:
- 創建一個名為“選擇”的角色
- 授予目前數據庫的連接/使用權限
- 授予選擇/執行所有模式的所有視圖(或至少在目前)
我嘗試了大量的 GRANT…ON…TO 組合,但我無法弄清楚。
**附加資訊:**這些腳本由 ANT 執行,已設置數據庫和模式名稱 (search_path)。所以我不能使用“production_db”或“qa_db”這樣的名稱。
目標是創建單個 PostgreSQL 角色,以便客戶端可以繞過 Tomcat(Hibernate)並直接在 Postgres 伺服器上執行選擇/搜尋。該角色必須能夠從“視圖”中進行選擇,但不能從其他內容中進行選擇。
更新:接受的答案使我找到了一個解決方案,在該解決方案中,我將所有視圖提取到一個單獨的模式並僅授予對該模式的訪問權限。
不幸的是,這並不容易,因為沒有“選擇任何視圖”權限(例如 Oracle 提供的)。
如果您可以將所有視圖放入一個模式中,那麼這可以通過授予該模式的選擇權限來實現。像這樣的東西:
首先,您需要創建一個可用於此的角色
create role view_reader;
該角色只需創建一次。
然後創建一個包含所有視圖的模式:
create schema view_holder;
然後允許 view_reader 讀取該架構中的所有內容:
grant select on all tables in schema report to view_reader; alter default privileges in schema view_holder grant select on tables to view_reader;
具有
all tables
誤導性,因為它還包括視圖 - 還包括表格。這就是為什麼您需要將視圖放入與表不同的模式中的原因。因為alter default privileges
在該模式中創建的任何新視圖都將自動可供view_reader
角色訪問。您現在可以創建一個可以選擇任何內容的使用者:
create user client password 'foobar'; alter user client set search_path = 'view_holder'; grant view_reader to client;
如果
client
登錄,預設模式將是view_holder
,因此select * from some_view
將預設為該模式中的視圖。但由於使用者僅對該模式中的視圖具有權限,因此他無法從基礎表中進行選擇。如果需要,您可以跳過中間角色 (
view_reader
),並將權限直接分配給client
。但我認為最好給每個客戶一個單獨的使用者。如果該模式中的視圖簡單地從“真實”視圖中選擇,如果您不能將視圖移動到不同的模式中,這也應該起作用。
請注意,這將增加視圖的維護複雜性,因為不幸的是,如果其他視圖依賴於它,Postgres 將不允許您更改視圖的列列表。