ユーザーに管理者権限を与えることなく、データベースのすべての権限を付与したいと考えています。その理由は、現時点では 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
すべてのテーブル、ビュー、シーケンスに対する/ 、、権限
を持ちます。さらにスキーマに対する権限もあります。次のロールに所属できます。SELECT
INSERT
UPDATE
DELETE
USAGE
GRANT
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 が使用されている場合、管理者は、このロールが付与されているロールを設定する必要があります。DELETE
USAGE
BYPASSRLS
BYPASSRLS
GRANT
定義済みロールを使用しないすべての権限(任意の 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 の時点では:
データベース オブジェクト (テーブル、列、ビュー、外部テーブル、シーケンス、データベース、外部データ ラッパー、外部サーバー、関数、プロシージャ、手続き型言語、スキーマ、または表領域) に対する権限
しかし、残りはほとんど必要ありません。詳細:
考慮する現在のバージョンへのアップグレード。