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の拡張です。