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

兼容性

MatrixDB数据库允许使用标识符语法(rolename),而SQL标准要求将角色名称写为字符串文字。 SQL在事务期间不允许使用此命令。 MatrixDB数据库没有进行此限制。 SESSION和LOCAL修饰符是MatrixDB数据库的扩展名,RESET语法也是如此。