1. ホーム
  2. sql

[解決済み】PostgreSQL。PostgreSQLデータベースでユーザーにすべての権限を与える

2022-04-03 08:39:43

質問

あるユーザーを管理者にすることなく、データベースの全権限を与えたいと思います。 なぜそうしたいかというと、現在、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で作業しています。

どのように解決するのですか?

すべてのコマンドは、正しいデータベースクラスタに接続されているときに実行する必要があります。それを確認してください。

ロールはデータベースのオブジェクト クラスタ . 同じクラスタのすべてのデータベースは、定義されたロールのセットを共有します。特権は、データベース、スキーマ、テーブルなどの単位で付与・剥奪されます。

ロールは データベース 当然ですが。これは 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 の権利は、すべてのスキーマで、たとえ 明示的に持っている。このロールにはrole属性はありません BYPASSRLS を設定します。RLSを使用している場合、管理者は セット BYPASSRLS であるロールに対して、このロールが GRANT を追加しました。

pg_write_all_data

すべてのデータ(テーブル、ビュー、シーケンス)を、あたかも INSERT , UPDATE および DELETE の権利と、それらのオブジェクトの USAGE 権利 を明示的に持たなくても、すべてのスキーマに適用されます。このロールは はロール属性 BYPASSRLS を設定します。RLSを使用する場合は 管理者は BYPASSRLS であるロールに対して、このロールが GRANT を追加しました。

定義済みのロールを使用しない全権限(Postgresの全バージョン)

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

ロールに必要なのは(最低でも USAGE の権限は スキーマ . 繰り返しになりますが、もしそれが PUBLIC であれば、カバーされます。それ以外は

GRANT USAGE ON SCHEMA public TO my_user;

または付与 USAGE すべて カスタムスキーマを使用します。

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
   WHERE  nspname <> 'information_schema' -- exclude information schema and ...
   AND    nspname NOT LIKE 'pg\_%'        -- ... system schemas
   );
END
$$;

次に、すべての テーブル (Postgresが必要 9.0 またはそれ以降)。

そして、忘れてはいけないのが シーケンス (もしあれば)。

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

あるいは pgAdmin 4 のグラントウィザード"。 をGUIで操作することができます。

の権限を対象としています。 既存 オブジェクトを作成します。将来のオブジェクトもカバーするには DEFAULT PRIVILEGES . ご覧ください。

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

<ブロッククオート

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

しかし、それ以外はほとんど必要ありません。詳細はこちら。

考察 最新バージョンへのアップグレード .