2025年9月25日: PostgreSQL 18 发布!
支持版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 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

SET ROLE

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

概要

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

描述

此命令将当前 SQL 会话的当前用户标识符设置为 role_name。角色名可以写成标识符或字符串字面量。执行 SET ROLE 后,SQL 命令的权限检查将按照该角色是最初登录的用户来执行。请注意,SET ROLESET SESSION AUTHORIZATION 是例外;它们的权限检查分别继续使用当前会话用户和初始会话用户(即 认证用户)。

当前会话用户必须拥有指定 role_nameSET 选项,无论是直接拥有还是通过拥有 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 语法也是如此。

提交更正

如果您在文档中发现任何不正确之处、与您对特定功能的体验不符之处或需要进一步澄清之处,请使用 此表格 报告文档问题。