↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 命令 / 角色与权限

SQL COMMAND · 角色与权限

SET ROLE

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

SET角色与权限引入 10(基线)现存至 20 devel0 次语法变更

动词
SET
对象
ROLE
引入版本
10(基线)
状态
现存
语法变更次数
0
手册小节数
5

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 无变化。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

SET SESSION LOCAL ROLE role_name
SET ROLE · 语法 2
SET SESSION LOCAL ROLE NONE
SET ROLE · 语法 3
RESET ROLE

语法概要

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

PostgreSQL 18 手册 · 查看完整参考页

描述

这个命令将当前 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允许使用标识符语法("rolename"),而 SQL 标准要求将角色名写成字符串字面量。SQL 不允许在事务中执行这个命令;PostgreSQL不施加这一限制,因为没有理由这样做。SESSION和LOCAL修饰符,以及 RESET语法,都是PostgreSQL扩展。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 17← 16正文更新

    正文更新
  2. PostgreSQL 16← 15正文更新

    正文更新
  3. PostgreSQL 14← 13正文更新

    正文更新
  4. PostgreSQL 11← 10正文更新

    正文更新

同组命令

命令动词对象版本变动最近变更
ROLES & PRIVILEGES角色与权限20 条↑
GRANTGRANT— 175 次
定义访问权限现存
REVOKEREVOKE— 175 次
撤销访问权限现存
ALTER DEFAULT PRIVILEGESALTERDEFAULT PRIVILEGES 184 次
定义默认访问权限现存
CREATE GROUPCREATEGROUP 192 次
定义一个新的数据库角色现存
ALTER GROUPALTERGROUP 141 次
更改角色名称或成员资格现存
DROP GROUPDROPGROUP —
移除一个数据库角色现存
SECURITY LABELSECURITYLABEL 122 次
定义或更改应用于对象的安全标签现存
DROP OWNEDDROPOWNED 141 次
移除一个数据库角色所拥有的数据库对象现存
REASSIGN OWNEDREASSIGNOWNED 141 次
更改一个数据库角色所拥有的数据库对象的所有权现存
CREATE POLICYCREATEPOLICY 141 次
为一个表定义一条新的行级安全策略现存
ALTER POLICYALTERPOLICY 141 次
更改一条行级安全策略的定义现存
DROP POLICYDROPPOLICY —
从一个表中移除一条行级安全策略现存
CREATE ROLECREATEROLE 172 次
定义一个新的数据库角色现存
ALTER ROLEALTERROLE 142 次
更改数据库角色现存
DROP ROLEDROPROLE —
移除一个数据库角色现存
SET ROLESETROLE —
设置当前会话的当前用户标识符现存
SET SESSION AUTHORIZATIONSETSESSION AUTHORIZATION —
设置当前会话的会话用户标识符和当前用户标识符现存
CREATE USERCREATEUSER 192 次
定义一个新的数据库角色现存
ALTER USERALTERUSER 142 次
更改数据库角色现存
DROP USERDROPUSER —
移除一个数据库角色现存