web-dev-qa-db-ja.com

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

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

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

これはPostgres 9.3または9.4の場合で、AWS RDS上のサーバーです。

13
tedder42

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

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

_SELECT nspname
  FROM pg_namespace;
_

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

_psql -f multigrant.sql
_

これの通常のバリアントは、収集された名前をループしてpsqlを呼び出し、作成されたGRANTステートメントを_-c_オプションに渡すシェルスクリプトです。

他のソリューションは基本的に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以降)。新しく追加されたスキーマに対してこの権限を手動で付与する必要があります。
  • ここでは、動的クエリを作成するときに dollar quoting を使用しています。これにより、たとえば、単一引用符を乗算するのではなく、「通常の」構文を使用できます(この例にはありません)。このようにして、ほとんどの編集者はステートメントを適切に強調します。
  • format() を_%I_形式指定子とともに使用して、必要に応じてオブジェクト名を適切に引用符で囲みます。このアプローチは、文字列定数といくつかのquote_ident()呼び出しを連結してクエリを作成するよりもはるかに読みやすくなっています。
  • _pg_namespace_は _pg_catalog_ スキーマにあります。そこにある他のオブジェクトをチェックしてみてください-それらはあなたのスキーマやテーブルなどのあらゆる側面を保存しています。
18
dezso

あなたも使えます。

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$;
0
Mateus Padua