SET ROLE

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

概要

  1. SET [SESSION | LOCAL] ROLE rolename
  2. SET [SESSION | LOCAL] ROLE NONE
  3. 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设置指定的会话变量。 会话变量仅在登录期间处理。

示例

  1. SELECT SESSION_USER, CURRENT_USER;
  2. session_user | current_user
  3. --------------+--------------
  4. peter | peter
  5. SET ROLE 'paul';
  6. SELECT SESSION_USER, CURRENT_USER;
  7. session_user | current_user
  8. --------------+--------------
  9. peter | paul

兼容性

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

另见

SET SESSION AUTHORIZATION

Parent topic: SQL Command Reference