SQL COMMAND · 角色与权限
SET ROLE
设置当前会话的当前用户标识符
SET角色与权限引入 10(基线)现存至 20 devel0 次语法变更
- 动词
SET- 对象
ROLE- 分组
- 角色与权限
- 引入版本
- 10(基线)
- 状态
- 现存
- 语法变更次数
- 0
- 手册小节数
- 5
版本轨迹
相对 PostgreSQL 17 无变化。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
SET ROLE · 语法 2
SET ROLE · 语法 3
语法概要
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扩展。
另见
语法演化
相邻大版本之间的差异,新的在前。版本号链接到对应快照。
PostgreSQL 17← 16正文更新
正文更新PostgreSQL 16← 15正文更新
正文更新PostgreSQL 14← 13正文更新
正文更新PostgreSQL 11← 10正文更新
正文更新
同组命令
| 命令 | 动词 | 对象 | 版本变动 | 最近变更 |
|---|---|---|---|---|
GRANT | GRANT | — | 175 次 | |
| 定义访问权限 | 现存 | |||
REVOKE | REVOKE | — | 175 次 | |
| 撤销访问权限 | 现存 | |||
ALTER DEFAULT PRIVILEGES | ALTER | DEFAULT PRIVILEGES | 184 次 | |
| 定义默认访问权限 | 现存 | |||
CREATE GROUP | CREATE | GROUP | 192 次 | |
| 定义一个新的数据库角色 | 现存 | |||
ALTER GROUP | ALTER | GROUP | 141 次 | |
| 更改角色名称或成员资格 | 现存 | |||
DROP GROUP | DROP | GROUP | — | |
| 移除一个数据库角色 | 现存 | |||
SECURITY LABEL | SECURITY | LABEL | 122 次 | |
| 定义或更改应用于对象的安全标签 | 现存 | |||
DROP OWNED | DROP | OWNED | 141 次 | |
| 移除一个数据库角色所拥有的数据库对象 | 现存 | |||
REASSIGN OWNED | REASSIGN | OWNED | 141 次 | |
| 更改一个数据库角色所拥有的数据库对象的所有权 | 现存 | |||
CREATE POLICY | CREATE | POLICY | 141 次 | |
| 为一个表定义一条新的行级安全策略 | 现存 | |||
ALTER POLICY | ALTER | POLICY | 141 次 | |
| 更改一条行级安全策略的定义 | 现存 | |||
DROP POLICY | DROP | POLICY | — | |
| 从一个表中移除一条行级安全策略 | 现存 | |||
CREATE ROLE | CREATE | ROLE | 172 次 | |
| 定义一个新的数据库角色 | 现存 | |||
ALTER ROLE | ALTER | ROLE | 142 次 | |
| 更改数据库角色 | 现存 | |||
DROP ROLE | DROP | ROLE | — | |
| 移除一个数据库角色 | 现存 | |||
SET ROLE | SET | ROLE | — | |
| 设置当前会话的当前用户标识符 | 现存 | |||
SET SESSION AUTHORIZATION | SET | SESSION AUTHORIZATION | — | |
| 设置当前会话的会话用户标识符和当前用户标识符 | 现存 | |||
CREATE USER | CREATE | USER | 192 次 | |
| 定义一个新的数据库角色 | 现存 | |||
ALTER USER | ALTER | USER | 142 次 | |
| 更改数据库角色 | 现存 | |||
DROP USER | DROP | USER | — | |
| 移除一个数据库角色 | 现存 | |||