PostgreSQL 8.2.3 中文文档
后退快退快进前进

SET ROLE

名称

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

语法

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

描述

这条命令将当前会话的当前用户标识为 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

后退首页前进
SET CONSTRAINTS上一级SET SESSION AUTHORIZATION