Postgresql
對數據庫中的所有模式都授予使用權限?
我想要給
GRANT USAGE
定數據庫的使用者/角色。數據庫有許多模式。我知道有一個
ON ALL TABLES IN SCHEMA
,但我想要“所有模式”。我試過GRANT USAGE .. ON DATABASE
了,但這顯然是錯誤的(它實際上並不存在)。這適用於 Postgres 9.3 或 9.4,它恰好是 AWS RDS 上的伺服器。
你至少有兩個選擇。
第一個使用小查詢和文本編輯器。我們必須收集我們感興趣的模式:
SELECT nspname FROM pg_namespace;
WHERE
如果要限制範圍,可以添加子句。複製輸出並修改它,這樣你就得到了一些GRANT USAGE ON SCHEMA ... TO your_role;
命令。然後只需將其餵給psql
,例如:psql -f multigrant.sql
一個常見的變體可能是一個 shell 腳本,它循環收集的名稱和呼叫
psql
,將構造的GRANT
語句傳遞給-c
選項。另一種解決方案在一個 pl/pgsql 塊中基本相同,建構一個動態查詢。核心是一樣的——我們必須收集模式。然後我們遍歷所有這些,按模式授予權限模式:
DO $do$ DECLARE sch text; BEGIN FOR sch IN SELECT nspname FROM pg_namespace LOOP EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch); END LOOP; END; $do$;
備註:
- 與表、序列、函式和類型不同,不能為模式設置預設權限(從 9.4 開始)。您必須手動為任何新添加的模式授予此權限。
- 在這裡,我在建構動態查詢時使用美元報價。例如,這允許我使用“正常”語法,而不是乘以單引號(本範例中不存在)。這樣,大多數編輯都會很好地突出顯示這些語句。
- 如果需要,我還使用
format()
格式%I
說明符來正確引用對象名稱。quote_ident()
這種方法比使用串聯字元串常量和一些呼叫來建構查詢更具可讀性。pg_namespace
可以在pg_catalog
架構中找到。查看那裡的其他對象 - 它們儲存您的模式、表等的各個方面。
你也可以用。
DO $do$ DECLARE sch text; BEGIN FOR sch IN SELECT nspname FROM pg_namespace where nspname != 'pg_toast' and nspname != 'pg_temp_1' and nspname != 'pg_toast_temp_1' and nspname != 'pg_statistic' and nspname != 'pg_catalog' and nspname != 'information_schema' LOOP EXECUTE format($$ GRANT USAGE ON SCHEMA %I TO your_role $$, sch); EXECUTE format($$ GRANT SELECT ON ALL SEQUENCES IN SCHEMA %I TO your_role $$, sch); EXECUTE format($$ GRANT SELECT ON ALL TABLES IN SCHEMA %I TO backup_user $$, sch); EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON TABLES TO your_role $$, sch); EXECUTE format($$ ALTER DEFAULT PRIVILEGES IN SCHEMA %I GRANT SELECT ON SEQUENCES TO your_role $$, sch); END LOOP; END; $do$;