SET ROLE — 设置当前会话的当前用户标识符
SET [ SESSION | LOCAL ] ROLE role_name
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
这个命令将当前 SQL 会话的当前用户标识符设置为 role_name。 角色名既可以写成标识符,也可以写成字符串字面量。 执行SET ROLE之后,对 SQL 命令的权限检查会按照 最初登录的就是该角色那样进行。注意, SET ROLE和 SET SESSION AUTHORIZATION是例外:对这两个命令的权限检查, 分别仍然使用当前会话用户和初始会话用户(即已认证用户)。
当前会话用户必须对指定的 role_name拥有SET选项, 这可以是直接拥有,也可以通过带有SET选项的成员关系链间接拥有。 (如果会话用户是超级用户,则可以选择任意角色。)
SESSION和LOCAL修饰符的作用与常规的 SET命令相同。
SET ROLE NONE将当前用户标识符设置为当前会话用户标识符, 即session_user返回的值。 如果存在此类设置,RESET ROLE会将当前用户标识符设置为 连接建立时由命令行选项、 ALTER ROLE或 ALTER DATABASE指定的设置。 否则,RESET ROLE会将当前用户标识符设置为当前会话用户标识符。 这些形式可以由任何用户执行。
使用这个命令,既可以增加权限,也可以限制自己的权限。 如果会话用户角色获得的是WITH INHERIT TRUE的成员关系, 它会自动拥有每个此类角色的全部权限。在这种情况下, SET ROLE实际上会去掉除目标角色直接拥有或继承而来的权限之外的所有权限。 另一方面,如果会话用户角色获得的是WITH INHERIT FALSE的成员关系, 默认就不能使用被授予角色的权限。但是,如果该角色是以 WITH SET TRUE授予的,则会话用户可以使用 SET ROLE放弃直接分配给自己的权限,转而获得该角色可用的权限。 如果该角色是以WITH INHERIT FALSE, SET FALSE授予的, 那么无论是否使用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允许使用标识符语法 ("),而 SQL 标准要求将角色名写成字符串字面量。 SQL 不允许在事务中执行这个命令; PostgreSQL不施加这一限制,因为没有理由这样做。 rolename"SESSION和LOCAL修饰符,以及 RESET语法,都是PostgreSQL扩展。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。