🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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_` 角色的成员。但超级用户可以选择任何角色。 `SESSION`和`LOCAL`修饰词的作用和普通的[SET](#calibre_link-675)命令一样。 `NONE`和`RESET`形式重置当前用户标识为当前会话用户标识符。任何用户都可以执行这种形式。 ## 注意 使用这条命令,它可能会增加一个用户的权限,也可能会限制一个用户的权限。 如果会话用户的角色有`INHERITS`属性,那么它自动拥有它能`SET ROLE` 变成的角色的所有权限;在这种情况下,`SET ROLE`实际上是删除了所有直接赋予会话用户的权限, 以及它的所属角色的权限,只剩下指定角色的权限。另一方面,如果会话用户的角色有 `NOINHERITS`属性,`SET ROLE`删除直接赋予会话用户的权限,而获取指定角色的权限。 实际上,如果一个超级用户`SET ROLE`为一个非超级用户,它会失去其超级用户权限。 `SET ROLE`有和[SET SESSION AUTHORIZATION](#calibre_link-508)类似的效果, 但是其中涉及的权限检查有区别。还有,`SET SESSION AUTHORIZATION` 决定其后有什么角色可以执行`SET ROLE`命令,而用`SET ROLE` 并不修改稍后的`SET ROLE`可以设置的角色集。 `SET ROLE`并不如同角色的[ALTER ROLE](#calibre_link-17)设置所声明的那样处理会话变量; 这只在登陆时发生。 `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并未做此限制,因为没有理由限制。 `SESSION`和`LOCAL`修饰词是PostgreSQL 的扩展,还有`RESET`语法也一样。 ## 又见 [SET SESSION AUTHORIZATION](#calibre_link-508)