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

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

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1
预发布版本文档。 PostgreSQL 19beta4 为测试版本,最终发布内容可能有所不同。

SET ROLE

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

大纲

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 扩展。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.