PostgreSQLのrole
GPT-4.icon
「ロールを付けられる対象」は 他のロール
PostgreSQLには「ユーザー」と「グループ」という明確な区別はありません。
すべては「ロール(role)」として扱われます。
ロールに LOGIN 属性があると「ユーザーとしてログインできる」=ユーザー的なロール。
ロールに LOGIN がないと「グループ的に使える」=グループ的なロール。
具体的には:
code:sql
-- ロールaliceを作成(ログイン可能=ユーザー的)
CREATE ROLE alice LOGIN;
-- ロールdevsを作成(グループ的)
CREATE ROLE devs;
-- alice に devs を「付与」する
GRANT devs TO alice;
この「GRANT devs TO alice」という操作は、「ロールdevsをロールaliceに付ける」ことを意味します。
つまり:
PostgreSQLでは、ロールは他のロールに対して付与できる(入れ子にできる)
→ ロールを付けられる対象は「ロール」です。ユーザーもまたロールの一種です。
ロールの属性(主なオプション)
table:table
属性 説明
------------- -------------------------
LOGIN ログインを許可(=ユーザー)
SUPERUSER 全権限を持つ管理者
CREATEDB データベースの作成権限
CREATEROLE 他のロールの作成権限
INHERIT 継承先のロールの権限を自動的に使用可(デフォルト)
NOINHERIT 明示的に SET ROLE しないと使えない
REPLICATION レプリケーションの使用可
BYPASSRLS 行レベルセキュリティを無視できる(9.5以降)
🔐 権限とロール
ロールに対して、以下のような権限を付与できます。
GRANT (sql)
REVOKE (sql)
code:sql
-- テーブルの読み取り権限をロール devs に付与
GRANT SELECT ON TABLE my_table TO devs;
-- 書き込み禁止にする
REVOKE INSERT ON TABLE my_table FROM devs;
ロールの操作コマンド
table:table
操作 コマンド例
---- ----------------------------
作成 CREATE ROLE name [options]
削除 DROP ROLE name
属性変更 ALTER ROLE name [options]
所属変更 GRANT group TO user
🧪 ロールの確認
code:sql
-- 現在のロール確認
SELECT current_user, session_user;
-- 全ロール一覧
\du -- psqlコマンド
-- 特定ロールの属性
SELECT * FROM pg_roles WHERE rolname = 'alice';
入れ子構造になる
GRANT A TO B;
GRANT B TO C;
とすると、Cは SET ROLE A で A の権限を使えるようにもできます(INHERITが関係)。
🔍 psqlで確認するには
code:bash
\du
このコマンドで、ログイン可能か、どのロールが付与されているかが一覧できます。