データベース内のすべてのスキーマで使用を許可しますか?


12

GRANT USAGE特定のデータベースのユーザー/ロールにしたい。データベースには多くのスキーマがあります。

があることは知っていますがON ALL TABLES IN SCHEMA、「すべてのスキーマ」が必要です。試しましたがGRANT USAGE .. ON DATABASE、それは明らかに間違っています(実際には存在しません)。

これはPostgres 9.3または9.4用で、AWS RDS上にあるサーバーです。

回答:


17

少なくとも2つのオプションがあります。

最初のものは、小さなクエリとテキストエディタを使用します。関心のあるスキーマを収集する必要があります。

SELECT nspname
  FROM pg_namespace;

WHEREスコープを制限する場合は、句を追加できます。出力をコピーして修正し、多くのGRANT USAGE ON SCHEMA ... TO your_role;コマンドを取得します。次にpsql、たとえばにフィードします。

psql -f multigrant.sql

これの通常の変形は、収集された名前と呼び出しをループしpsql、構築されたGRANTステートメントを-cオプションに渡すシェルスクリプトです。

もう 1つのソリューションは、1つの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_namespacepg_catalogスキーマにあります。そこにある他のオブジェクトをチェックしてください-スキーマ、テーブルなどのあらゆる側面を保存します。

1
grant usage新しいスキーマに対して自動的に実行されるイベントトリガーを使用して、新しく作成されたスキーマのデフォルトの権限をシミュレートできるかどうか疑問に思います。
a_horse_with_no_name

@a_horse_with_no_nameそれについて考えると、私は現在それができなかった理由がわかりません。
dezso

0

あなたも使用できます。

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 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$;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.