SET SESSION AUTHORIZATION

设置当前会话的会话角色标识符和当前角色标识符。

概要

SET [SESSION | LOCAL] SESSION AUTHORIZATION <rolename>

SET [SESSION | LOCAL] SESSION AUTHORIZATION DEFAULT

RESET SESSION AUTHORIZATION

描述

此命令将当前SQL会话上下文的会话角色标识符和当前角色标识符设置为角色名。角色名可采用标识符或字符串字面量形式书写。使用此命令可实现例如临时切换为无特权用户,随后再切换回超级用户等操作。

会话角色标识符初始设置为客户端提供的(可能经过身份验证的)角色名称。当前角色标识符通常等同于会话用户标识符,但在setuid函数及类似机制的上下文中可能临时变更;也可通过SET ROLE进行修改。当前用户标识符与权限检查相关。

仅当初始会话用户(即经过身份验证的用户)具备超级用户权限时,才可更改会话用户标识符。否则,该命令仅在指定经过身份验证的用户名时才会被接受。

DEFAULT 和 RESET 表单将会话和当前用户标识符重置为最初经过身份验证的用户名。任何用户均可运行这些表单。

参数

  • SESSION
    • 指定该命令对当前会话生效。此为默认设置。
  • LOCAL
    • 指定该命令仅对当前事务生效。在执行COMMIT或ROLLBACK后,会话级设置将重新生效。请注意,若在事务外部执行SET LOCAL,该命令将看似无效。
  • rolename
    • 要承担的角色名称。
  • NONE
  • RESET
    • 重置会话和当前角色标识符,使其与登录时使用的角色一致。

      示例

      
      SELECT SESSION_USER, CURRENT_USER;
      session_user | current_user 
      --------------+--------------
      peter        | peter

SET SESSION AUTHORIZATION 'paul';

SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- paul | paul



## 兼容性
SQL标准允许使用其他表达式替代字面角色名,但这些选项在实际应用中并不重要。数据库支持标识符语法(角色名),而SQL不支持。SQL在事务期间禁止此命令;数据库则无此限制。SESSION和LOCAL修饰符属于数据库扩展功能,RESET语法亦然。

## 另见
[SET ROLE](/doc/sql_ref/set_role)