【PostgreSQL】コマンド(psql)でロールを操作する方法

DB

複数ユーザがDBを利用する際にそれぞれアクセス権限を設定するのがロールです。今回はpsqlコマンドでロールを操作する方法について紹介します。

ロールについて

PostgreSQLにおけるDBのユーザ管理はロール管理として行います。ロールを管理することで、データベースへのアクセスやデータ(CRUD)操作の認証管理ができます。

デフォルトではpostgresという名称のロールのみが存在します。postgresロールは全ての権限を持つスーパーユーザです。postgresロールから別のロールを作成していくところからPostgreSQLのロール管理はスタートします。

ロールの属性

ロールには様々な属性(ロールに割り当てられる権限)が存在します。主要な属性として、

  • 当該ロールがログイン可能か
  • 当該ロールがデータベースを作成できるか
  • 当該ロールが他のロールを作成できるか
  • 当該ロールが特権ロールか

といったものがあります。あるデータベースへのログイン属性を割り当てられていないロールはそのデータベースにアクセスできませんし、ロール作成属性を与えられていないロールは他のロールを新規に作成できません。

データベースオブジェクトへのアクセス権限

テーブルやシーケンスなどデータベースオブジェクトに対するアクセス権限も、オブジェクト単位で付与することができます。

たとえばあるロールはテーブルAを参照できるが、テーブルBは参照できないといった細かい制御が可能です。オブジェクトに対するアクセス権限はGRANTコマンドで付与し、REVOKEコマンドで取り下げます。

ロールの操作

ここからは実際にロールを作成してみましょう。まずはpsqlを開きます(postgresロールでログインしてください)。

ロール作成

新規にロールを作成する場合はCREATE ROLEコマンドを用います。

CREATE ROLE ロール名;

CREATE ROLE user01;

または、CREATE USERコマンドでも作成可能です。

CREATE USER user01;

CREATE USERで作成した場合はログイン属性を持ちますが、CREATE ROLEで作成したロールはログイン属性を持ちません。

属性管理

作成したロールの属性を管理していきます。先にも述べましたが、主な属性には次のようなものがあります。

属性名説明
LOGINログイン権限
CREATEDBデータベース作成
CREATEROLEロール作成
SUPERUSERスーパユーザ

属性付与

属性をロールに付与したい場合、CREATE ROLEコマンドに属性を付随させることでロール作成時に属性を付与することができます。

CREATE ROLE ロール名 属性1 属性2..;

例えばLOGINとCREATEDB属性を付与したい場合は以下のようなコマンドを実行します。

CREATE ROLE user02 LOGIN CREATEDB;
CREATE ROLE user02 LOGIN CREATEDB;

既存のロールに属性を追加する場合は、ALTER ROLEコマンドを使います。

CREATE ROLE ロール名 属性1 属性2..;

user01にSUPERUSER権限を与えてみます。

ALTER ROLE user01 SUPERUSER;

属性除去

現在付与されている属性を取り下げるには、ALTER ROLEコマンドを使用し、属性の前にNOを付けます。

例えばuser02からLOGIN属性を取り除く場合、

ALTER ROLE user02 NOLOGIN;

とします。それ以外もNOSUPERUSER、NOCREATEDBといった具合です。

パスワード

パスワードはロールがデータベースにアクセスする際に必要となります。ロール作成時にパスワードを設定する場合は、

CREATE ROLE ロール名 PASSWORD 'パスワード';

パスワードを取り除く場合はPASSWORDにNULLを指定します。

CREATE ROLE 名前 PASSWORD NULL;

権限

権限は、ユーザがテーブルなどデータベースオブジェクトに対する操作権限を指します。例えばテーブルを作成したロールはそのテーブルに対するほとんどの権限を持ちますが、それ以外のロールがそのテーブルにアクセスするには、アクセスする権限が必要になります。

権限には以下のようなものがあります。

権限名説明
SELECTテーブル、ビュー、シーケンスへの参照
INSERTテーブルへのレコード挿入
UPDATEテーブルのレコード更新
DELETEテーブルからのレコード削除
TRUNCATEテーブルのレコードを全て削除する
REFERENCES外部キー制約を持つテーブルを作成するために必要
TRIGGERトリガ作成
CREATE新規スキーマおよびテーブル作成
CONNECTデータベースへの接続
TEMPORARY一時テーブルの作成
EXECUTE指定された関数、さらにその関数で実装されている任意の演算子の使用

権限付与

権限付与にはGRANTコマンドを使用します。

GRANT 権限 ON テーブル名 TO ロール名

例えば以下のようなコマンドになります。

GRANT SELECT, DELETE ON table01 TO user01;

すべての権限をまとめて与える場合は権限部分をALLとすることができます。

GRANT ALL ON テーブル名 TO ロール名

特定テーブルに対し、すべてのロールにまとめて権限付与する場合は以下のようなコマンドを実行します。

GRANT 権限 ON テーブル名 TO PUBLIC

1つのロールに対し、全てのテーブルの権限をまとめて付与する場合は以下のようなコマンドを実行します。

GRANT 権限 ON ALL TABLES IN SCHEMA public TO ロール名

このあたりよく使うと思うので要チェックです。

権限削除

権限削除にはREVOKEコマンドを用います。

REVOKE 権限 ON テーブル名 TO ロール名

例えば以下のようなコマンドです。

REVOKE SELECT, DELETE ON table01 TO user01;

ロール削除

既存のロールを削除する場合にはDROP ROLEコマンドを用います。

DROP ROLE ロール名

例えばuser01を削除する場合は、

DROP ROLE user01;

とします。

あるいは、dropuserでも削除可能です。

DROP USER ロール名

ロール一覧の表示

最後にロール一覧を表示する方法です。\duコマンドでロール一覧を取得できます。

\du

まとめ

psqlでロールを操作する方法を紹介しました。ロールの管理はDB運用において重要な要素でもあると思うので、参考にしてみてください。

ではでは👋