このコマンドは現在の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