这条命令将当前会话的当前用户标识为 rolename 。角色名可以写成表识符或者是字符串文本。在 SET ROLE 之后,SQL 命令的权限检查就好像当初登录的用户是此命令指定的用户那样。
当前会话的用户必须是指定的 rolename 角色的成员。但超级用户可以选择任何角色。
SESSION 和 LOCAL 修饰词的作用和普通的 SET 命令一样。
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 可以设置的角色集。
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