SET ROLE — 現在のセッションにおける現在のユーザ識別子を設定する
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
このコマンドは現在のSQLセッションにおける現在のユーザ識別子をrole_name
に設定します。
ロール名は識別子あるいは文字列リテラルのどちらを使用しても記述することができます。
SET ROLE
の後、SQLコマンドに対する権限検査は、指定されたロールで普通にログインした場合と同様に行われます。
指定するrole_name
は、現在のセッションユーザがメンバとして属するロールでなければなりません。
(セッションユーザがスーパーユーザであった場合、任意のロールを選択することができます。)
SESSION
およびLOCAL
修飾子は通常のSETコマンドと同様に動作します。
NONE
およびRESET
構文は、現在のユーザ識別子を現在のセッションユーザ識別子に戻します。
この構文はすべてのユーザが実行することができます。
このコマンドを使用して、権限を追加することも制限することもできます。
セッションユーザのロールがINHERITS
属性を持つ場合、自動的にSET ROLE
で設定可能なすべてのロールの権限を持ちます。
この場合、SET ROLE
は実際、セッションユーザに直接割り当てられている権限、セッションユーザが属するロールに割り当てられている権限の内、指定されたロールで使用可能な権限を残し、他をすべて削除します。
一方、セッションユーザのロールがNOINHERITS
属性を持つ場合、セッションユーザに直接割り当てられた権限をすべて削除し、指定されたロールで利用可能な権限を獲得します。
特に、スーパーユーザが非特権ユーザへのSET ROLE
を行うと、スーパーユーザ権限を失うことになります。
SET ROLE
の影響はSET SESSION AUTHORIZATIONと似ていますが、行われる権限検査はかなり異なります。
また、SET SESSION AUTHORIZATION
は、それ以降に実行するSET ROLE
コマンドでどのロールに変更できるかを決定しますが、SET ROLE
を使用してロールを変更した場合、それ以降に実行するSET ROLE
コマンドで変更可能なロール群は変更されません。
SET ROLE
はロールのALTER ROLE設定で指定されたセッション変数を処理しません。
これはログイン時のみ適用されます。
SET ROLE
をSECURITY DEFINER
関数内で使用することはできません。
SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- peter | peter SET ROLE 'paul'; SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- peter | paul
PostgreSQLでは、識別子構文("rolename"
)を使用できます。
しかし、標準SQLではロール名を文字列リテラルとして記述しなければなりません。
SQLでは、トランザクション内でこのコマンドを実行することを許可していません。
PostgreSQLでは、このように制限する理由がありませんので、この制限はありません。
SESSION
、LOCAL
修飾子、および、RESET
構文はPostgreSQLの拡張です。