2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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_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语法也是如此。

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用此表格报告文档问题。