Postgresql

對數據庫中的所有模式都授予使用權限?

  • March 15, 2022

我想要給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$;

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