ロールと権限
PostgreSQL のロールと権限の仕組みとは?
PostgreSQL では、ユーザーもグループもどちらもロールです。GRANT はオブジェクトに対する権限をロールに付与し、別のロールのメンバーであるロールは、そのロールの権限を使用できます。
PostgreSQL はロールによってアクセスを制御します。ロールはユーザー(LOGIN 属性を持つ)としても、グループとしても、その両方としても機能し、データベースオブジェクトを所有します。SELECT、INSERT、UPDATE、USAGE などの権限は、GRANT で特定のオブジェクトに対して付与し、REVOKE で取り消します。
あるロールを別のロールのメンバーにすると、そのロールの権限を使えるようになります。そのため、権限はグループロールに付与し、ログインロールをそれらのグループに追加するのが一般的なパターンです。ロールはデータベースごとではなく、データベースクラスタ全体に存在します。オブジェクトの所有者とスーパーユーザーはそのオブジェクトに対して何でもできるため、アプリケーション用のロールは所有者やスーパーユーザーとは分けておいてください。
例
この例では、reporting というグループロールと、それに所属する analyst というログインロールを作成し、グループに SELECT を付与します。has_table_privilege により、analyst がテーブルを読み取れるものの、挿入はできないことを確認します。
CREATE ROLE reporting NOLOGIN;
CREATE ROLE analyst LOGIN IN ROLE reporting;
CREATE TABLE revenue_daily (day date PRIMARY KEY, amount numeric);
GRANT SELECT ON revenue_daily TO reporting;
SELECT has_table_privilege('analyst', 'revenue_daily', 'SELECT') AS can_select,
has_table_privilege('analyst', 'revenue_daily', 'INSERT') AS can_insert;拡張機能なしの標準の PostgreSQL 16 または 17 で動くプレーンな SQL です。破棄してかまわない空のデータベースで実行してください。
出典
PostgreSQL 公式ドキュメント(英語)。