SET ROLE

Name

SET ROLE -- 设置当前会话的当前用户标识符

Synopsis

SET [ SESSION | LOCAL ] ROLE rolename
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE

描述

这条命令设置当前 SQL 会话的当前用户标识为 rolename。 角色名可以写成表识符或者是字串文本。在 SET ROLE 之后, SQL 命令的权限检查就好像当初登录的用户是此命令指定的用户那样。

指定的 rolename 必须是一个当前会话的用户是其中成员的角色。 (如果会话用户是超级用户,那么可以选择任何角色。)

SESSIONLOCAL 修饰词的作用和普通的 SET 命令一样。

NONERESET 形式重置当前用户标识为当前会话用户表识符。 任何用户都可以执行这种形式。

注意

使用这条命令,它可能会增加一个用户的权限,也可能会限制一个用户的权限。 如果会话用户的角色有 INHERITS 属性,那么它自动拥有它能 SET ROLE 变成的角色的所有权限;在这种情况下,SET ROLE 实际上是删除了所有直接赋予会话用户的权限, 以及它是所属成员的其它角色的权限,只剩下指定角色的权限。 另外一方面,如果会话用户的角色有 NOINHERITS 属性,SET ROLE 删除直接赋予会话用户的权限,而获取指定角色可用的权限。

实际上,如果一个超级用户 SET ROLE 为一个非超级用户, 她会失去其超级用户权限。

SET ROLE 有和 SET SESSION AUTHORIZATION 类似的效果,但是其中涉及的权限检查有区别。还有, SET SESSION AUTHORIZATION 判断有什么角色可以用于稍后的 SET ROLE 命令,而用 SET ROLE 并不修改稍后的 SET 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

兼容性

PostgreSQL 允许标识符语法("rolename"), 而 SQL 标准要求角色名字写成字串文本。SQL 并不允许在事务里面执行这条命令; PostgreSQL 并未做此限制,因为没有理由限制。 SESSIONLOCAL 修饰词是 PostgreSQL 的扩展,还有 RESET 一样。

又见

SET SESSION AUTHORIZATION