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

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 12 已结束支持。 2024-11-21. 请参阅 当前版本手册.

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

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

SET ROLE NONE 将当前用户标识符设置为当前会话用户标识符,即 session_user 返回的值。如果存在此类设置,RESET ROLE 会将当前用户标识符设置为连接建立时由命令行选项、ALTER ROLE 或 ALTER DATABASE 指定的设置。否则,RESET ROLE 会将当前用户标识符设置为当前会话用户标识符。这些形式可以由任何用户执行。

注解

使用这个命令,既可以增加权限,也可以限制自己的权限。如果会话用户角色具有 INHERIT 属性,它会自动拥有每个可通过 SET ROLE 切换到的角色的全部权限;在这种情况下,SET ROLE 实际上会去掉直接分配给会话用户及其所属其他角色的全部权限,只保留指定角色可用的权限。另一方面,如果会话用户角色具有 NOINHERIT 属性,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 不施加这一限制,因为没有理由这样做。SESSION 和 LOCAL 修饰符,以及 RESET 语法,都是 PostgreSQL 扩展。

报告文档问题

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