3 回答

TA貢獻(xiàn)1757條經(jīng)驗 獲得超7個贊
將使用情況/選擇授予單個表
如果僅將CONNECT授予數(shù)據(jù)庫,則用戶可以連接,但沒有其他特權(quán)。您必須在名稱空間(方案)上授予USAGE,并在表和視圖上分別授予SELECT,如下所示:
GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
多個表/視圖(PostgreSQL 9.0+)
在最新版本的PostgreSQL中,您可以使用單個命令授予對模式中所有表/視圖/等的權(quán)限,而不必一個個地鍵入它們:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
這只會影響已經(jīng)創(chuàng)建的表。功能更強(qiáng)大的是,將來您可以自動將默認(rèn)角色分配給新對象:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
請注意,默認(rèn)情況下,這僅會影響發(fā)出此命令的用戶創(chuàng)建的對象(表):盡管也可以在發(fā)出用戶所屬的任何角色上進(jìn)行設(shè)置。但是,在創(chuàng)建新對象時,您不會為您所隸屬的所有角色選擇默認(rèn)特權(quán)...因此仍然存在一些麻煩。如果采用數(shù)據(jù)庫具有所有者角色的方式,并且模式更改是作為該所有者角色執(zhí)行的,則應(yīng)為該所有者角色分配默認(rèn)特權(quán)。恕我直言,這有點令人困惑,您可能需要進(jìn)行實驗以提出功能正常的工作流程。
多個表/視圖(9.0之前的PostgreSQL版本)
為了避免冗長的多表更改中的錯誤,建議使用以下“自動”過程來生成GRANT SELECT每個表/視圖所需的內(nèi)容:
SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');
這應(yīng)該將所有GRANT命令的相關(guān)GRANT命令公開輸出到所有表,視圖和序列上,以實現(xiàn)復(fù)制n粘貼。自然,這將僅應(yīng)用于已經(jīng)創(chuàng)建的表。

TA貢獻(xiàn)1812條經(jīng)驗 獲得超5個贊
請注意,PostgreSQL 9.0(今天處于beta測試中)將有一種簡單的方法:
test=> GRANT SELECT ON ALL TABLES IN SCHEMA public TO joeuser;
GRANT

TA貢獻(xiàn)1836條經(jīng)驗 獲得超3個贊
創(chuàng)建只讀用戶的腳本:
CREATE ROLE Read_Only_User WITH LOGIN PASSWORD 'Test1234'
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity';
為該只讀用戶分配權(quán)限:
GRANT CONNECT ON DATABASE YourDatabaseName TO Read_Only_User;
GRANT USAGE ON SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO Read_Only_User;
添加回答
舉報