SET ROLE
设置当前会话的当前角色标识符。
概要
SET [SESSION | LOCAL] ROLE rolename
SET [SESSION | LOCAL] ROLE NONE
RESET ROLE
描述
此命令将当前SQL会话上下文的当前角色标识符设置为rolename。 角色名称可以写为标识符或字符串文字。 在SET ROLE之后,将执行SQL命令的权限检查,就好像新角色是最初登录的角色一样。
指定的rolename必须是当前会话用户所属的角色。 如果会话用户是超级用户,则可以选择任何角色。
NONE和RESET表单将当前角色标识符重置为当前会话角色标识符。 这些表格可以由任何用户执行。
参数
SESSION
指定该命令对当前会话生效。这是默认值。
LOCAL
指定该命令仅对当前事务生效。 在COMMIT或ROLLBACK之后,会话级设置将再次生效。 请注意,如果SET LOCAL在事务外部执行,则似乎无效。
rolename
在此会话中用于权限检查的角色名称。
NONE
RESET
将当前角色标识符重置为当前会话角色标识符(用于登录的角色的标识符)。
注解
使用此命令,可以添加特权或限制特权。 如果会话用户角色具有INHERITS属性,则它将自动拥有可以SET ROLE的每个角色的所有特权; 在这种情况下,SET ROLE有效地放弃直接分配给会话用户及其成员的其他角色的所有特权,仅保留命名角色可用的特权。 另一方面,如果会话用户角色具有NOINHERITS属性, 则SET ROLE会删除直接分配给会话用户的特权,而是获取可用于命名角色的特权。
特别是,当超级用户选择将SET ROLE设置为非超级用户角色时,她将失去其超级用户特权。
SET ROLE具有与SET SESSION AUTHORIZATION相同的效果,但是所涉及的特权检查却大不相同。 同样,SET SESSION AUTHORIZATION确定以后的SET ROLE命令允许哪些角色, 而使用SET ROLE不会更改后续SET ROLE可以更改的角色集。
SET ROLE不处理由角色的ALTER ROLE设置指定的会话变量。 会话变量仅在登录期间处理。
示例
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
兼容性
Greenplum数据库允许使用标识符语法(rolename),而SQL标准要求将角色名称写为字符串文字。 SQL在事务期间不允许使用此命令。 Greenplum数据库没有进行此限制。 SESSION和LOCAL修饰符是Greenplum数据库的扩展名,RESET语法也是如此。
另见
Parent topic: SQL Command Reference