SET ROLE

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

Synopsis

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

Description

此命令将当前 SQL 会话的当前用户标识符设置为* role_name *。角色名称可以写为标识符或字符串 Literals。在SET ROLE之后,将执行 SQL 命令的权限检查,就好像命名角色是最初登录的角色一样。

指定的* role_name *必须是当前会话用户所属的角色。 (如果会话用户是超级用户,则可以选择任何角色.)

SESSIONLOCAL修饰符的作用与常规SET命令相同。

NONERESET表单将当前用户标识符重置为当前会话用户标识符。这些表格可以由任何用户执行。

Notes

使用此命令,可以添加特权或限制一个人的特权。如果会话用户角色具有INHERIT属性,则它会自动拥有SET ROLE可以拥有的每个角色的所有特权;例如,在这种情况下,SET ROLE有效地删除直接分配给会话用户及其成员的其他角色的所有特权,仅保留命名角色可用的特权。另一方面,如果会话用户角色具有NOINHERIT属性,则SET ROLE放弃直接分配给会话用户的特权,而是获取可用于命名角色的特权。

特别是,当超级用户选择SET ROLE成为非超级用户角色时,他们将失去其超级用户特权。

SET ROLE的效果可与设置会话授权媲美,但是所涉及的特权检查却大不相同。同样,SET SESSION AUTHORIZATION确定以后的SET ROLE命令允许哪些角色,而使用SET ROLE更改角色不会将允许的角色集更改为以后的SET ROLE

SET ROLE不处理由角色的ALTER ROLE设置指定的会话变量;这仅在登录期间发生。

SET ROLE不能在SECURITY DEFINER函数中使用。

Examples

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

Compatibility

PostgreSQL 允许标识符语法("rolename"),而 SQL 标准要求将角色名称写为字符串 Literals。 SQL 在事务期间不允许使用此命令。 PostgreSQL 没有限制,因为没有理由。 SESSIONLOCAL修饰符是 PostgreSQL 扩展,RESET语法也是如此。

See Also

设置会话授权