跳转至

SET ROLE

SET ROLE

设置当前会话的当前角色标识符。

语法

``` sql SET [SESSION | LOCAL] ROLE rolename

SET [SESSION | LOCAL] ROLE NONE

RESET ROLE ```

描述

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

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

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

参数

该SQL命令参数说明见下

SESSION
指定该命令对当前会话生效。这是默认值。
LOCAL
指定该命令仅对当前事务生效。 在COMMITROLLBACK之后,会话级设置将再次生效。 请注意,如果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数据库没有进行此限制。SESSIONLOCAL修饰符是SeaboxMPP数据库的扩展名,RESET语法也是如此。
相关SQL命令
SET SESSION AUTHORIZATION