一時的に別のロールになり替わる(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 ロールの権限を継承していません。

別のロールになり替わる(1)

admin ロールには mydb データベースの public スキーマに作成された staff テーブルに対して SELECT 権限を持っています。

別のロールになり替わる(2)

neko ロールは admin ロールの権限を継承していないため、現在 staff テーブルのデータを取得しようとしてもエラーとなります。

select * from staff;

別のロールになり替わる(3)

それでは neko ロールで接続している状態で、メンバとなっている admin ロールになり替わります。次のように実行してください。

set role admin;

別のロールになり替わる(4)

一時的に admin ロールになり替わりました。確認のために session_user (接続を開始した時に認証に使われたユーザー) と current_user (現在の権限がどうなっているのか確認の対象となるユーザー)を取得してみます。

select session_user, current_user;

別のロールになり替わる(5)

session_user は接続時に指定した neko ロールですが、 current_user は SET ROLE コマンドでなり替わっている admin ロールになっていることが確認できます。

それでは先ほど失敗した staff テーブルのデータを改めて取得してみます。

select * from staff;

別のロールになり替わる(6)

今度はstaff テーブルからデータを取得することができました。このようにメンバとなっているロールであれば一時的なり替わってそのロールが持つ権限を利用することができます。

別のロールへのなり替わりをリセットする

SET ROLE コマンドによる別のロールへのなり替わりは、現在のセッション中またはトランザクション中の一時的なものですが、任意のタイミングでなり替わりをリセットして元のロール戻ることができます。次のように実行してください。

SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE

どちらの書式を使用してもなり替わりをリセットすることができます。

-- --

それでは実際に試してみます。 neko ロールで PostgreSQL に接続したあと、 admin ロールになり替わってください。

set role admin;

別のロールへのなり替わりをリセットする(1)

確認のために session_user と current_user を取得してみます。

select session_user, current_user;

別のロールへのなり替わりをリセットする(2)

neko ロールが現在 admin ロールになり替わっていることが確認できました。

それではなり替わりをリセットします。次のように実行してください。

set role NONE;

別のロールへのなり替わりをリセットする(3)

neko ロールが admin ロールに対してなり替わっていたものがリセットされました。確認のために session_user と current_user を取得してみます。

select session_user, current_user;

別のロールへのなり替わりをリセットする(4)

current_user も neko ロールに戻っていることが確認できました。

-- --

SET ROLE コマンドを使って別のロールになる方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。