PostgreSQL: PostgreSQL データベースのユーザーにすべての権限を付与する 質問する

PostgreSQL: PostgreSQL データベースのユーザーにすべての権限を付与する 質問する

ユーザーに管理者権限を与えることなく、データベースのすべての権限を付与したいと考えています。その理由は、現時点では DEV と PROD は同じクラスター上の異なる DB であるため、ユーザーが本番環境のオブジェクトを変更できるようにするのではなく、DEV 上のオブジェクトを変更できるようにする必要があるためです。

私は試した:

grant ALL on database MY_DB to group MY_GROUP;

しかし、何の許可も与えないようです。

それから私は試しました:

grant all privileges on schema MY_SCHEMA to group MY_GROUP;

オブジェクトを作成する権限は与えられているようですが、他のユーザーに属するそのスキーマ上のオブジェクトをクエリ/削除する権限は与えられていないようです。

MY_SCHEMA のユーザーに USAGE 権限を与えることもできますが、そうするとテーブルに対する権限がないというエラーが発生します...

私の質問は、DB 上のすべての権限をユーザーに付与する簡単な方法があるかどうかということです。

私はPostgreSQL 8.1.23で作業しています。

ベストアンサー1

すべてのコマンドは、適切なデータベース クラスターに接続した状態で実行する必要があります。必ず確認してください。

ロールはデータベースクラスターのオブジェクトです。同じクラスターのすべてのデータベースは、定義されたロールのセットを共有します。権限は、データベース / スキーマ / テーブルなどごとに付与 / 取り消されます。

当然ながら、ロールにはデータベースPUBLICへのアクセス権が必要です。これはデフォルトで付与されます。そうでない場合:

GRANT CONNECT ON DATABASE my_db TO my_user;

Postgres 14 以降の基本権限

Postgres 14では、事前定義された非ログインロールが追加されました。pg_read_all_data/pg_write_all_dataすべてのテーブル、ビュー、シーケンスに対する/ 、、権限
を持ちます。さらにスキーマに対する権限もあります。次のロールに所属できます。SELECTINSERTUPDATEDELETEUSAGEGRANT

GRANT pg_read_all_data TO my_user;
GRANT pg_write_all_data TO my_user;

これには、すべての基本的な DML コマンドが含まれます (ただし、DDL や、関数の権限TRUNCATEなどの一部の特殊なコマンドは含まれませんEXECUTE)。マニュアル:

pg_read_all_data

SELECTすべてのデータ (テーブル、ビュー、シーケンス) を、それらのオブジェクトに対する権限を持っているかのように読み取りますUSAGE。また、明示的に権限を持っていなくても、すべてのスキーマに対する権限を持ちます。このロールには、ロール属性がBYPASSRLS設定されていません。RLS が使用されている場合、管理者は、BYPASSRLSこのロールが付与されているロールを設定する必要がありますGRANT

pg_write_all_data

すべてのデータ (テーブル、ビュー、シーケンス) を、それらのオブジェクトに対する 、 、 権限、およびすべてのスキーマに対する権限 (INSERT明示UPDATE的に権限がない場合でも) を持っているかのように書き込みます。このロールには、ロール属性が設定されていません。RLS が使用されている場合、管理者は、このロールが付与されているロールを設定する必要があります。DELETEUSAGEBYPASSRLSBYPASSRLSGRANT

定義済みロールを使用しないすべての権限(任意の Postgres バージョン)

コマンドは、適切なデータベースに接続した状態で実行する必要があります。必ず確認してください。

ロールには、(少なくとも)スキーマUSAGEに対する権限が必要です。 繰り返しますが、それが に付与されていれば、問題ありません。 そうでない場合:PUBLIC

GRANT USAGE ON SCHEMA public TO my_user;

オブジェクトの作成も許可するには、ロールにCREATE権限が必要です。Postgres 15ではセキュリティが強化されましたデフォルト スキーマに対する権限はpublic付与されなくなりますPUBLIC。これも必要になる場合があります。または、ALLロールに付与するだけです。

GRANT ALL ON SCHEMA public TO my_user;

または、すべてのカスタム スキーマにUSAGE//CREATEを付与します。ALL

DO
$$
BEGIN
   -- RAISE NOTICE '%', (  -- use instead of EXECUTE to see generated commands
   EXECUTE (
      SELECT string_agg(format('GRANT USAGE ON SCHEMA %I TO my_user', nspname), '; ')
   FROM   pg_namespace
   -- SELECT string_agg(format('GRANT ALL   ON SCHEMA %I TO my_user', nspname), '; ')
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

次に、すべてのテーブルのすべての権限。また、レガシー列に使用されるシーケンス(存在する場合) も忘れないでくださいserial

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO my_user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO my_user;

Postgres 10 以降では、列を列IDENTITYに置き換えることができるserialため、関連するシーケンスに対して個別の権限は必要ありません。次を参照してください。

あるいは、pgAdmin 4 の「許可ウィザード」GUI を操作する。

これは既存のオブジェクトの権限をカバーします。将来のオブジェクトもカバーするには、DEFAULT PRIVILEGES。 見る:

他にもいくつかオブジェクトがありますマニュアルGRANT完全なリストがあります。Postgres 14 の時点では:

データベース オブジェクト (テーブル、列、ビュー、外部テーブル、シーケンス、データベース、外部データ ラッパー、外部サーバー、関数、プロシージャ、手続き型言語、スキーマ、または表領域) に対する権限

しかし、残りはほとんど必要ありません。詳細:

考慮する現在のバージョンへのアップグレード

おすすめ記事