したい - GRANT USAGE
指定されたデータベースのユーザー/ロールに。データベースには多くのスキーマがあります。
ON ALL TABLES IN SCHEMA
ですが、「すべてのスキーマ」が必要です。私は試した GRANT USAGE .. ON DATABASE
、しかしそれは明らかに間違っています(実際にはexistではありません)。
これはPostgres 9.3または9.4の場合で、AWS RDS上のサーバーです。
少なくとも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$;
_
メモ:
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 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$;