SET ROLE

名前

SET ROLE -- 現在のセッションにおける現在のユーザ識別子を設定する

概要

SET [ SESSION | LOCAL ] ROLE rolename
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE

説明

このコマンドは現在のSQLセッションにおける現在のユーザ識別子をrolenameに設定します。 ロール名は識別子あるいは文字列リテラルのどちらを使用しても記述することができます。 SET ROLEの後、SQLコマンドに対する権限検査は、指名されたロールで普通にログインした場合と同様に行われます。

指定するrolenameは、現在のセッションユーザがメンバとして属するロールでなければなりません。 (セッションユーザがスーパーユーザであった場合、任意のロールを選択することができます。)

SESSIONおよびSESSION修飾子は通常のSETコマンドと同様に動作します。

NONEおよびRESET形式は、現在のユーザ識別子を現在のセッションユーザ識別子に戻します。 この形式はすべてのユーザが実行することができます。

N注釈

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

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

SET ROLEの影響はSET SESSION AUTHORIZATIONと似ていますが、行われる権限検査はかなり異なります。 また、SET SESSION AUTHORIZATIONは、その後に実行するSET ROLEコマンドでどのロールに変更できるかを決定しますが、SET ROLEを使用してロールを変更した場合、その後に実行するSET 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