SET ROLE
SET ROLE¶
设置当前会话的当前角色标识符。
- 语法
-
``` sql SET [SESSION | LOCAL] ROLE rolename
SET [SESSION | LOCAL] ROLE NONE
RESET ROLE ```
- 描述
-
此命令将当前SQL会话上下文的当前角色标识符设置为
rolename
。 角色名称可以写为标识符或字符串文字。 在SET ROLE
之后,将执行SQL命令的权限检查,就好像新角色是最初登录的角色一样。指定的
rolename
必须是当前会话用户所属的角色。 如果会话用户是超级用户,则可以选择任何角色。NONE
和RESET
表单将当前角色标识符重置为当前会话角色标识符。 这些表格可以由任何用户执行。 - 参数
-
该SQL命令参数说明见下
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
设置指定的会话变量。 会话变量仅在登录期间处理。 - 示例
-
``` sql 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 ```
- 兼容性说明
- SeaboxMPP数据库允许使用标识符语法(
rolename
),而SQL标准要求将角色名称写为字符串文字。SQL在事务期间不允许使用此命令。 SeaboxMPP数据库没有进行此限制。SESSION
和LOCAL
修饰符是SeaboxMPP数据库的扩展名,RESET
语法也是如此。 - 相关SQL命令
SET SESSION AUTHORIZATION