On this page
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
*必须是当前会话用户所属的角色。 (如果会话用户是超级用户,则可以选择任何角色.)
SESSION
和LOCAL
修饰符的作用与常规SET命令相同。
NONE
和RESET
表单将当前用户标识符重置为当前会话用户标识符。这些表格可以由任何用户执行。
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 没有限制,因为没有理由。 SESSION
和LOCAL
修饰符是 PostgreSQL 扩展,RESET
语法也是如此。