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允许标识符语法 ("
),而 SQL 标准要求角色名称写成字符串文字。SQL 不允许在事务期间使用此命令;PostgreSQL没有做出此限制,因为没有理由这样做。 rolename
"SESSION
和LOCAL
修饰符是PostgreSQL扩展,RESET
语法也是如此。
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用此表格报告文档问题。