2011-06-23 48 views
16

我想爲所有數據庫中的所有表創建僅具有select特權的用戶。我以爲我可以得到數據庫列表,併爲每個數據庫應用以下命令:如何爲Postgresql中的所有數據庫創建具有隻讀權限的用戶?

GRANT select ON DATABASE dbname to user1; 

但我得到了以下錯誤:

ERROR: invalid privilege type SELECT for database 

當我一派人勸去做grant select操作所有表格。但新表總是被添加。所以這對我來說不是一個可接受的解決方案。有誰知道任何解決方法?

+0

@Jonas其實這是基本的SQL,所以不非常適合DBA - http://dba.stackexchange。com/faq – Stefano

回答

17

你不能做到這一點在數據庫級,只在架構層面。

假設你只使用public架構中的每個數據庫,你可以這樣做:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user; 
+2

您的聲明表明這將適用於新創建的表和視圖是不正確的 - 「所有表」只是簡單地用於在每個當前存在的表上運行GRANT SELECT,並且不設置任何默認值。要設置新對象的默認值,您需要ALTER DEFAULT PRIVILEGES命令:http://www.postgresql.org/docs/current/static/sql-alterdefaultprivileges.html(請參閱下面的答案) – IMSoP

+0

@IMSoP:感謝您指出說出來! –

+0

最初的問題是所有表和所有數據庫的SELECt主題。這是可能的在MySQL中,但(我認爲)不可能在postgres。在postgres中,必須爲每個數據庫單獨授予這些權限。 也許你可以添加這個作爲澄清(或糾正我,如果有可能的話)。 – Michael

4

我知道你已經說過,這不是一個可以接受的答案,但它是正確的答案呢。

指定安全(grant和revoke)是表設計和測試的一部分。

表定義,安全測試之前,不要移動表,生產和測試數據是版本控制之下。

話雖如此,PostgreSQL沒有對數據庫的任何SELECT權限。您只能授予數據庫的CREATE,CONNECT或TEMP權限。

你可以在給定模式中的所有表授予SELECT。我不知道如何影響運行GRANT語句後創建的表,但它測試起來相當容易。

PostgreSQL Grant syntax

21

你需要做兩件事情:第一,允許訪問現有對象;其次,設置從現在開始創建的新對象的默認訪問權限。請注意,授予對「TABLES」的訪問權限包括視圖,但不包括序列(例如「SERIAL」列的自動遞增功能),因此您可能也希望授予對這些權限的訪問權限。下面

的假定你想要做的public架構的一切。通過省略IN SCHEMA ...子句,ALTER DEFAULT PRIVILEGES語句可以作用於整個數據庫;必須爲每個模式運行一次GRANT

-- Grant access to current tables and views 
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1; 
-- Now make sure that's also available on new tables and views by default 
ALTER DEFAULT PRIVILEGES 
    IN SCHEMA public -- omit this line to make a default across all schemas 
    GRANT SELECT 
ON TABLES 
TO user1; 

-- Now do the same for sequences 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1; 
ALTER DEFAULT PRIVILEGES 
    IN SCHEMA public -- omit this line to make a default across all schemas 
    GRANT SELECT, USAGE 
ON SEQUENCES 
TO user1; 

PostgreSQL的手動

+0

奇怪的是,我需要'授予使用架構公開給user1;'以及 –

3

Postgres的版本比9.0更低:

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO USER;' 
FROM pg_tables WHERE schemaname = 'public'" | psql -d DBNAME 

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO USER;' 
FROM pg_views WHERE schemaname = 'public'" | psql -d DBNAME 

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;' 
FROM pg_statio_all_sequences WHERE schemaname = 'public'" | psql -d DBNAME 
+0

我必須做'psql -d DBNAME -qAt -c「SELECT'GRANT SELECT ON'|| relname ||'TO USER;' FROM pg_statio_all_tables WHERE schemaname ='public'「| psql -d DBNAME「 – tymik

相關問題