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
语法也是如此。
另见
[SET SESSION AUTHORIZATION](SET_SESSION_AUTHORIZATION.html#topic1)
Parent topic: SQL Command Reference