支持的版本:当前 (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 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 语法也是如此。

提交更正

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