DB上のユーザーにすべての権限を与える


206

管理者にすることなく、データベースに対するすべての権限をユーザーに付与したいと思います。その理由は、現時点では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に取り組んでいます。

回答:


271

ユーザーは明らかにデータベースにアクセスする必要があります。

GRANT CONNECT ON DATABASE my_db TO my_user;

そして(少なくとも)スキーマに対するUSAGE特権:

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 IIIの「グラント・ウィザード」(デフォルトGUI)を使用することができます。

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

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

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

現在のバージョンへのアップグレードを検討してください。


133
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;

24
すべての特権を付与するON DATABASEことは強力なように思えますが、それほど効果はありません。ほんの始まりにすぎません。含まれているオブジェクトに対する特権は付与されません。
Erwin Brandstetter 2018

50

PostgreSQL 9.0以降では、次のようにします。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA MY_SCHEMA TO MY_GROUP;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA MY_SCHEMA TO MY_GROUP;

新しく作成した関係に対してもこれを有効にする場合は、デフォルトの権限を設定します。

ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON TABLES TO MY_GROUP;
ALTER DEFAULT PRIVILEGES IN SCHEMA MY_SCHEMA
  GRANT ALL PRIVILEGES ON SEQUENCES TO MY_GROUP;

ただし、8.1を使用していることを確認するには、自分でコーディングする必要があります。

CREATE FUNCTION grant_all_in_schema (schname name, grant_to name) RETURNS integer AS $$
DECLARE
  rel RECORD;
BEGIN
  FOR rel IN
    SELECT c.relname
    FROM pg_class c
    JOIN pg_namespace s ON c.namespace = s.oid
    WHERE s.nspname = schname
  LOOP
    EXECUTE 'GRANT ALL PRIVILEGES ON ' || quote_ident(schname) || '.' || rel.relname || ' TO ' || quote_ident(grant_to);
  END LOOP;
  RETURN 1;
END; $$ LANGUAGE plpgsql STRICT;
REVOKE ALL ON FUNCTION grant_all_in_schema(name, name) FROM PUBLIC;

これにより、すべてのリレーション(テーブル、ビュー、インデックス、シーケンスなど)に対する特権が設定されます。これを制限する場合は、でフィルタリングしpg_class.relkindます。pg_classのドキュメントを参照してくださいを参照してください。

この関数は、スーパーユーザーとして、アプリケーションで必要なだけ定期的に実行する必要があります。オプションは、これを毎日または毎時間実行するcronジョブにパッケージ化することです。


こんにちはパトリック、「ALL TABLES」は8.1では使用できません(postgresql.org/docs/8.1/static/sql-grant.html)。回避しようとしています。しかし、あなたの助けに感謝
ディエゴ

@Diego:8.1の解決策を追加
Patrick

おかげでパトリック、私はあなたがしたようなものを使ってしまいましたが、「GRANT ALL」は使いませんでした。どういうわけかそれは何もしないようです。たとえば、私は実行しました。スキーマテストのALLをuserAに付与します。その後、userAはスキーマテストのテーブルから読み取るためのアクセス権をまだ持っていません
Diego

2
スキーマの使用を許可する必要があります。次に、そのスキーマ内のすべての関係(テーブル、ビュー、シーケンス、インデックスなど)に対して、SELECT、INSERT、UPDATE、DELETE、TRUNCATEを個別に付与する必要があります。スキーマは名前空間であり、関係はデータが置かれる場所です。
Patrick

28

PostgreSQL 9.4.15データベースにロール「eSumit」を追加し、このロールへのすべての権限を提供するために、次のことを行いました。

CREATE ROLE eSumit;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO eSumit;

GRANT ALL PRIVILEGES ON DATABASE "postgres" to eSumit;

ALTER USER eSumit WITH SUPERUSER;

また、pg_tableエントリを次のように確認しました。

select * from pg_roles; ここに画像の説明を入力してください

データベースクエリのスナップショット: ここに画像の説明を入力してください


Postgresバージョン10.3を使用していて、データベース名を引用符で囲むと構文エラーがスローされます。
サジド2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.