SET ROLE

Name

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

Synopsis

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

描述

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

当前会话的用户必须是指定的role_name角色的成员。 但超级用户可以选择任何角色。

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可以设置的角色集。

SET ROLE不处理角色的ALTER ROLE设置所声明的会话变量; 这仅发生在登陆期间。

SET ROLE不能在一个SECURITY DEFINER函数内使用。

示例

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