データベースを管理者にせずに、データベースに対するすべての権限をユーザーに付与したいと思います。私がそうしたいのは、現時点では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に取り組んでいます。
ユーザーは明らかにデータベースにアクセスする必要があります。
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)を使うことができます。
もっと:
しかし、実際には、 現在のバージョンにアップグレードする必要があります 。
GRANT ALL PRIVILEGES ON DATABASE "my_db" to my_user;
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ジョブにこれをパッケージ化することです。
私は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エントリをチェックしてください。