Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

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 必须是当前会话用户是其成员的角色。(如果会话用户是超级用户,则可以选择任何角色。)

SESSIONLOCAL 修饰符的作用与常规 SET 命令相同。

SET ROLE NONE 将当前用户标识符设置为当前会话用户标识符,由 session_user 返回。RESET ROLE 将当前用户标识符设置为连接时设置,由 命令行选项ALTER ROLEALTER 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 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 没有做出此限制,因为没有理由这样做。SESSIONLOCAL 修饰符是 PostgreSQL 扩展,RESET 语法也是如此。

另请参见

SET SESSION AUTHORIZATION