一時的に別のロールになり替わる(SET ROLE)
SET ROLE コマンドを実行することで、一時的に別のロールになって操作などを行うことができます。別のロールになることで、そのロールが持つ権限を持つことになります。ここでは PostgreSQL で SET ROLE コマンドを使って別のロールになる方法について解説します。
(Last modified: )
別のロールになり替わる
SET ROLE コマンドを使うことで別のロールになり替わることができます。書式は次のとおりです。
SET [ SESSION | LOCAL ] ROLE role_name
一時的に指定したロール( role_name )になり替わります。なり替われるロールは自分がメンバとして属しているロールのみです。コマンド実行時に SESSION を指定した場合は現在のセッションの間だけ有効となり、 LOCAL を指定した場合は現在のトランザクションの間だけ有効となります。省略した場合は SESSION が指定されたものとして扱われます。
別のロールになり替わると、なり替わったロールの権限を受け継ぎます。逆に本来のロールに与えられていた権限は削除されますので注意してください。例えばスーパーユーザーのロールが別のロールになり替わるとスーパーユーザーとしての権限が一時的になくなります。
-- --
それでは実際に試してみます。 admin ロールと neko ロールが作成されており neko ロールは admin ロールのメンバです。 neko ロールはロールの作成時に NOINHERIT が指定されており admin ロールの権限を継承していません。
admin ロールには mydb データベースの public スキーマに作成された staff テーブルに対して SELECT 権限を持っています。
neko ロールは admin ロールの権限を継承していないため、現在 staff テーブルのデータを取得しようとしてもエラーとなります。
select * from staff;
それでは neko ロールで接続している状態で、メンバとなっている admin ロールになり替わります。次のように実行してください。
set role admin;
一時的に admin ロールになり替わりました。確認のために session_user (接続を開始した時に認証に使われたユーザー) と current_user (現在の権限がどうなっているのか確認の対象となるユーザー)を取得してみます。
select session_user, current_user;
session_user は接続時に指定した neko ロールですが、 current_user は SET ROLE コマンドでなり替わっている admin ロールになっていることが確認できます。
それでは先ほど失敗した staff テーブルのデータを改めて取得してみます。
select * from staff;
今度はstaff テーブルからデータを取得することができました。このようにメンバとなっているロールであれば一時的なり替わってそのロールが持つ権限を利用することができます。
別のロールへのなり替わりをリセットする
SET ROLE コマンドによる別のロールへのなり替わりは、現在のセッション中またはトランザクション中の一時的なものですが、任意のタイミングでなり替わりをリセットして元のロール戻ることができます。次のように実行してください。
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
どちらの書式を使用してもなり替わりをリセットすることができます。
-- --
それでは実際に試してみます。 neko ロールで PostgreSQL に接続したあと、 admin ロールになり替わってください。
set role admin;
確認のために session_user と current_user を取得してみます。
select session_user, current_user;
neko ロールが現在 admin ロールになり替わっていることが確認できました。
それではなり替わりをリセットします。次のように実行してください。
set role NONE;
neko ロールが admin ロールに対してなり替わっていたものがリセットされました。確認のために session_user と current_user を取得してみます。
select session_user, current_user;
current_user も neko ロールに戻っていることが確認できました。
-- --
SET ROLE コマンドを使って別のロールになる方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。