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将当前用户标识符设置为当前会话用户标识符。任何用户都可以执行这些形式。
注释
使用此命令,可以添加权限或限制权限。如果会话用户角色已被授予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没有做出此限制,因为没有理由这样做。SESSION和LOCAL修饰符是PostgreSQL扩展,RESET语法也是如此。
