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

SET ROLE

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

概要

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

描述

此命令将当前 SQL 会话的当前用户标识符设置为 角色_名称。角色名称可以写为标识符或字符串文本。在执行 SET ROLE 后,会根据 role_name 是会话的最初登录用户来检查 SQL 命令的权限。请注意,SET ROLESET SESSION AUTHORIZATION 是例外;权限检查会继续使用当前会话用户和最初的会话用户(已通过身份验证的用户)。

当前会话用户必须对指定 role_name 具有 SET 选项,可以通过会员关系链(具有 SET 选项)直接或间接获得。(如果会话用户是超级用户,则可以选择任何角色。)

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 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 语法也是如此。