Postgresの基本概念
ロールは、必要な権限が与えられた場合に、dbクラスター内のすべてのデータベースにアクセスできるグローバルオブジェクトです。
クラスター 多くのデータベースを保持します 、多くのスキーマを保持します 。異なるDBのスキーマ(同じ名前であっても)は無関係です。スキーマの権限の付与は、現在のDB(付与時の現在のDB)内のこの特定のスキーマにのみ適用されます。
すべてのデータベースは、スキーマpublic
で始まります デフォルトでは。これは慣例であり、多くの設定はそれから始まります。それ以外は、スキーマpublic
他のスキーマと同じです。
MySQLから来ているので、単一のスキーマpublic
から始めたいと思うかもしれません。 、スキーマレイヤーを事実上完全に無視します。私はデータベースごとに数十のスキーマを定期的に使用しています。
スキーマはファイルシステムのディレクトリに少し(完全ではありませんが)似ています。
複数のスキーマを使用する場合は、必ずsearch_path
を理解してください。 設定:
- search_pathは識別子の解決と「現在のスキーマ」にどのように影響しますか
デフォルトの権限
GRANT
のドキュメントごと :
PostgreSQLは、一部のタイプのオブジェクトに対するデフォルトの権限を
PUBLIC
に付与します 。PUBLIC
には権限が付与されていません デフォルトでは、テーブル、列、スキーマ、またはテーブルスペースにあります。その他のタイプの場合、PUBLIC
に付与されるデフォルトの特権 次のとおりです。CONNECT
およびCREATE TEMP TABLE
データベース用。EXECUTE
機能の特権;およびUSAGE
言語の特権。
これらのデフォルトはすべて、ALTER DEFAULT PRIVILEGES
で変更できます。 :
- データベース内の特定のスキーマのすべてをPostgreSQLのグループロールに付与します
グループの役割
@Craigがコメントしたように、GRANT
するのが最善です グループロールへの権限を付与してから、そのロールの特定のユーザーメンバーを作成します(GRANT
グループロールからユーザーロールへ)。これにより、特定のタスクに必要な一連の特権を簡単に処理して取り消すことができます。
グループロールは、ログインなしの単なる別のロールです。ログインを追加して、ユーザーロールに変換します。詳細:
- PostgreSQLがユーザーとグループをロールにマージしたのはなぜですか?
事前定義された役割
更新: Postgres 14以降では、新しい定義済みの役割(正式には「デフォルトの役割」)が追加されますpg_read_all_data
およびpg_write_all_data
以下のいくつかを単純化するために。参照:
- データベースのすべてのテーブルへのアクセスを許可する
レシピ
たとえば、新しいデータベースmydb
があります。 、グループmygrp
、およびユーザーmyusr
...
スーパーユーザーとして問題のデータベースに接続している間(postgres
例):
REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
「ユーザーにすべてのテーブルへのすべての権限」を割り当てるには あなたが書いたように(私はもっと制限的かもしれません):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
将来のオブジェクトにデフォルトの権限を設定するには、すべての役割に対して実行します このスキーマにオブジェクトを作成します:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
次に、グループをユーザーに付与します:
GRANT mygrp TO myusr;
関連する回答:
- PostgreSQL-DBユーザーは関数の呼び出しのみを許可する必要があります
代替(非標準)設定
MySQLから来ており、データベースに対する特権を分離したいので、この非標準設定db_user_namespace
が好きかもしれません。 。ドキュメントごと:
このパラメーターは、データベースごとのユーザー名を有効にします。デフォルトではオフになっています。
マニュアルを注意深くお読みください。この設定は使用しません。上記を無効にすることはありません。