★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

SET ROLE

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コマンドと同様に動作します。

SET ROLE NONEは現在のユーザ識別子をsession_userにより返される現在のセッションユーザ識別子に設定します。 RESET ROLEは現在のユーザ識別子を、設定が存在するのならコマンドラインオプションALTER ROLEALTER DATABASEで指定される接続時の設定にします。 そうでなければ、RESET ROLEは現在のユーザ識別子を現在のセッションユーザ識別子に設定します。 この構文はすべてのユーザが実行できます。

注釈

このコマンドを使用して、権限を追加することも制限することもできます。 セッションユーザのロールがINHERIT属性を持つ場合、自動的にSET ROLEで設定可能なすべてのロールの権限を持ちます。 この場合、SET ROLEは実際、セッションユーザに直接割り当てられている権限、セッションユーザが属するロールに割り当てられている権限の内、指定されたロールで使用可能な権限を残し、他をすべて削除します。 一方、セッションユーザのロールがNOINHERIT属性を持つ場合、SET ROLEはセッションユーザに直接割り当てられた権限をすべて削除し、指定されたロールで利用可能な権限を獲得します。

特に、スーパーユーザが非特権ユーザへのSET ROLEを行うと、スーパーユーザ権限を失うことになります。

SET ROLEの影響はSET SESSION AUTHORIZATIONと似ていますが、行われる権限検査はかなり異なります。 また、SET SESSION AUTHORIZATIONは、それ以降に実行するSET ROLEコマンドでどのロールに変更できるかを決定しますが、SET ROLEを使用してロールを変更した場合、それ以降に実行するSET ROLEコマンドで変更可能なロール群は変更されません。

SET ROLEはロールのALTER ROLE設定で指定されたセッション変数を処理しません。 これはログイン時のみ適用されます。

SET ROLESECURITY 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では、このように制限する理由がありませんので、この制限はありません。 SESSIONLOCAL修飾子、および、RESET構文はPostgreSQLの拡張です。

関連項目

SET SESSION AUTHORIZATION