↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

Wiki / SQL 命令

SET ROLE

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

英文手册覆盖始于 PostgreSQL 6.4. 来源历史与运行验证各自保留独立版本边界。

当前阅读 PG 18·选择有来源记录的版本

anchor
SQL-SET-ROLE
file
sql-set-role.html
lang
en
name
SET ROLE
purpose
set the current user identifier of the current session
purpose zh
未知
sections same as
未知
slug
18
synopsis html
SET [ SESSION | LOCAL ] ROLE <em class="replaceable"><code>role_name</code></em> SET [ SESSION | LOCAL ] ROLE NONE RESET ROLE
synopsis text
SET [ SESSION | LOCAL ] ROLE role_name SET [ SESSION | LOCAL ] ROLE NONE RESET ROLE

语法

SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
语法图

从左向右阅读;分支表示选择,旁路表示可选,循环表示重复。点击带下划线的参数可打开对应规则。

SET SESSION LOCAL ROLE role_name
SET ROLE · 语法 2
SET SESSION LOCAL ROLE NONE
SET ROLE · 语法 3
RESET ROLE

版本定义 PG 18

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

描述

这个命令将当前 SQL 会话的当前用户标识符设置为 role_name。角色名既可以写成标识符,也可以写成字符串字面量。执行SET ROLE之后,对 SQL 命令的权限检查会按照最初登录的就是该角色那样进行。注意,SET ROLE和 SET SESSION AUTHORIZATION是例外:对这两个命令的权限检查,分别仍然使用当前会话用户和初始会话用户(即已认证用户)。

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

SESSION和LOCAL修饰符的作用与常规的 SET命令相同。

SET ROLE NONE将当前用户标识符设置为当前会话用户标识符,即session_user返回的值。如果存在此类设置,RESET ROLE会将当前用户标识符设置为连接建立时由命令行选项、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修饰符,以及 RESET语法,都是PostgreSQL扩展。

另见

SET SESSION AUTHORIZATION

比较版本

来源引用

完整定义与证据 JSON

定义来源

center · PostgreSQL 18 · a709ab85

正文语言: zh-Hans · 1b5ca64c