PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

SET ROLE

SET ROLE — 设置当前会话的当前用户标识符

Synopsis

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

描述

这条命令把当前 SQL 会话的当前用户标识符设置为 role_name。角色名可以写成一个标识符,也可以写成一个字符串字面值。在 SET ROLE 之后,对 SQL 命令的权限检查将如同命名的角色就是最初登录的那个角色一样进行。注意 SET ROLE 和 SET SESSION AUTHORIZATION 是例外;对这两者的权限检查分别继续使用当前会话用户和初始会话用户(即经过身份验证的用户)。

当前会话用户必须拥有 SET 选项,既可以直接拥有针对指定 role_name 的该选项,也可以通过一条带有 SET 选项的成员关系链间接拥有。(如果会话用户是超级用户,则可以选择任何角色。)

SESSION 和 LOCAL 修饰符的作用与普通 SET 命令中的相同。

SET ROLE NONE 把当前用户标识符设置为当前会话用户标识符,即 session_user 所返回的值。RESET ROLE 把当前用户标识符设置为连接时由 command-line options(命令行选项)、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 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 允许标识符语法("rolename"),而 SQL 标准要求角色名必须写成一个字符串字面值。SQL 不允许在事务期间执行这条命令;PostgreSQL 不做这种限制,因为没有理由这样做。SESSION 和 LOCAL 修饰符是 PostgreSQL 的扩展,RESET 语法也是如此。

另请参阅

SET SESSION AUTHORIZATION