SET ROLE — 現在のセッションにおける現在のユーザ識別子を設定する
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
このコマンドは現在のSQLセッションにおける現在のユーザ識別子をrole_nameに設定します。
ロール名は識別子あるいは文字列リテラルのどちらを使用しても記述することができます。
SET ROLEの後、SQLコマンドに対する権限検査は、指定されたロールで普通にログインした場合と同様に行われます。
現在のセッションユーザは、直接的にまたはSETオプションを使用したメンバシップの連鎖を介して間接的に、指定するrole_nameに対してSETオプションを持つことが必要です。
(セッションユーザがスーパーユーザであった場合、任意のロールを選択することができます。)
SESSIONおよびLOCAL修飾子は通常のSETコマンドと同様に動作します。
SET ROLE NONEは現在のユーザ識別子をsession_userにより返される現在のセッションユーザ識別子に設定します。
RESET ROLEは現在のユーザ識別子を、設定が存在するのならコマンドラインオプション、ALTER ROLEやALTER DATABASEで指定される接続時の設定にします。
そうでなければ、RESET ROLEは現在のユーザ識別子を現在のセッションユーザ識別子に設定します。
この構文はすべてのユーザが実行できます。
このコマンドを使用して、権限を追加することも制限することもできます。
セッションユーザのロールにWITH INHERIT TRUEメンバ資格が付与されている場合、そのロールのすべての権限が自動的に付与されます。
この場合、SET ROLEによって、対象のロールが直接所有している権限と継承している権限を除くすべての権限が事実上削除されます。
一方、セッションユーザのロールにWITH INHERIT FALSEメンバ資格が付与されている場合、デフォルトでは付与されたロールの権限にアクセスできません。
ただし、ロールにWITH SET TRUEが付与されている場合、セッションユーザはSET ROLEを使用して、セッションユーザに直接権限を付与する権限を削除し、代わりに指定されたロールに対して使用可能な権限を取得できます。
ロールにWITH INHERIT FALSE, SET FALSEが付与されている場合、SET ROLEの有無にかかわらず、その権限を行使できません。
スーパーユーザが非特権ユーザへの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では、識別子構文(")を使用できます。
しかし、標準SQLではロール名を文字列リテラルとして記述しなければなりません。
SQLでは、トランザクション内でこのコマンドを実行することを許可していません。
PostgreSQLでは、このように制限する理由がありませんので、この制限はありません。
rolename"SESSION、LOCAL修飾子、および、RESET構文はPostgreSQLの拡張です。