web-dev-qa-db-ja.com

DB上のユーザーにすべての許可を与える

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

157
Diego

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

GRANT CONNECT ON DATABASE my_db TO my_user;

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

GRANT USAGE ON SCHEMA public TO my_user;

それから、すべてのテーブルに対するすべての許可(Postgres9.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の "Grant Wizard"(デフォルトのGUI)を使うことができます。

もっと:

しかし、実際には、 現在のバージョンにアップグレードする必要があります

185
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
102
Unkas

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ジョブにこれをパッケージ化することです。

46
Patrick

私は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エントリをチェックしてください。

pg_rolesから*を選択します。 enter image description here

データベースクエリのスナップショット: enter image description here

18
Sumit Arora