Postgresql

PostgreSQL:僅訪問視圖的登錄角色

  • January 12, 2017

我需要編寫一個必須執行以下操作的 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 將不允許您更改視圖的列列表。

引用自:https://dba.stackexchange.com/questions/102262