2012-07-22 85 views
10

如何在PostgreSQL 8.4的模式中的所有表上授予DML(SELECT,INSERT,UPDATE,DELETE)?我也希望這筆贈款能夠在未來繼續創造新的表格。PostgreSQL 8.4將所有表的DML權限授予角色

我已經看到了9.0的解決方案,但是我堅持使用8.4,因爲它隨Debian穩定版一起提供。

我曾嘗試以下作爲基準,但它不能正常工作,導致不可避免的「訪問關係X被拒絕」:

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser; 

我已經通過文件疏浚,我不能似乎找到了合適的解決方案。

+0

爲什麼不能升級?肯定有辦法升級PostgreSQL。目前的版本都可以從Postgres網站下載。 – 2012-07-22 14:08:23

+0

確實有升級的方法,但我不希望供應商提供的軟件包能很好地集成,測試和理解。我們的計劃是在9.1的同時,Debian wheezy被宣佈爲穩定。 – pointyhat 2012-07-22 14:35:03

+0

我永遠不會明白爲什麼有些操作系統會光顧用戶。 – 2012-07-22 14:37:30

回答

21

我也希望這個補助金能夠在未來繼續創建新的表格。 [...]我已經通過文檔挖掘,我似乎無法找到合適的解決方案。

因爲在9.0之前沒有。所有你可以得到的是設置現有的表的權限。您必須爲每個表執行一個GRANT,因爲在9.0之前沒有「批量」模式。請參閱SQL語法的8.49.0

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } 
    [,...] | ALL [ PRIVILEGES ] } 
    ON [ TABLE ] tablename [, ...] 
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

和9.0的位置:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } 
    [,...] | ALL [ PRIVILEGES ] } 
    ON { [ TABLE ] table_name [, ...] 
     | ALL TABLES IN SCHEMA schema_name [, ...] } 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

ALL TABLES IN SCHEMA部分是你缺少一個。

另外:在數據庫級別設置權限與您的問題一樣,不會對您有所幫助:您將「僅」設置數據庫的權限,但不設置表中的任何「包含」內容。相關部分:

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } 
    ON DATABASE dbname [, ...] 
    TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

這意味着你只能設置數據庫本身CREATECONNECTTEMP權限,但沒有SELECTINSERT


到目前爲止,對於壞的東西。你可以做有以下幾點:

  • 通過授予用戶無法而是角色的權限降低權限管理的數量。然後將角色添加到單個用戶。創建新表時,您只需調整一個或兩個角色,但不需要調整數百個用戶。

  • 查詢系統目錄並創建適當的GRANT命令。將它們保存到一個文件中並執行該文件。這應該會讓你更容易啓動。

這樣的查詢可能是這樣的:

select 'GRANT ALL ON ' || table_schema || '.' || table_name ||' to my_group;' 
from information_schema.tables 
where 
    table_type = 'BASE TABLE' and 
    table_schema not in ('pg_catalog', 'information_schema'); 
+0

感謝您的回答 - 完美解釋! – pointyhat 2012-07-22 14:39:26

+0

比我的回答更清晰,更完整,謝謝。 – 2012-07-22 23:24:26

+0

不幸的是,它不會授予序列的權限 - 而這些通常是有用的權限。 – Calimo 2013-06-19 08:12:08

2

補助的PostgreSQL是不是遞歸的;在數據庫上GRANT設置權限的數據庫對象,但不影響所包含的模式或他們的表,視圖,函數等

授予對數據庫補助CREATECONNECTTEMPORARY權利ALL PRIVELEGES

見PSQL \h GRANT,或the documentation for GRANT in 8.4,看到什麼ALL PRIVILEGES手段DATABASE

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } 
    ON DATABASE database_name [, ...] 
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 

有可用的使用pg_cataloginformation_schema動態建立GRANT S和遞歸設置PLPGSQL功能和多種第三方腳本權利。搜索「postgresql遞歸授權」。

這些將不會幫助您爲新的表設置默認訪問權限。 PostgreSQL doe有ALTER DEFAULT PRIVILEGES,允許您爲新表設置默認表權限,但僅在Pg 9.1和更高版本中支持。顯式GRANT s對於舊版本中的每個表或在創建表後設置權限時都是必需的。

正如您所指出的,較新的版本可通過GRANT ... ALL TABLES獲得多項撥款,但您的問題僅限於8.4。

0

添加所有權限的所有表:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [username]; 
+2

將不適用於Postgres <9 – 2014-05-26 07:03:58

1

如果誰擁有DML權限的另一用戶,它工作在PostgreSQL的網絡版8.x/9.x中:

grant <userWithDMLPrivileges> to testuser; 

希望它有幫助。