SQL COMMAND · 角色与权限
ALTER DEFAULT PRIVILEGES
定义默认访问权限
ALTER角色与权限引入 10(基线)现存至 20 devel4 次语法变更
- 动词
ALTER- 对象
DEFAULT PRIVILEGES- 分组
- 角色与权限
- 引入版本
- 10(基线)
- 状态
- 现存
- 语法变更次数
- 4
- 手册小节数
- 5
版本轨迹
相对 PostgreSQL 17:语法概要新增 10 行,移除 0 行。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
abbreviated_grant_or_revoke
语法概要
相对 PostgreSQL 17 新增 10 行,移除 0 行;新增行以绿色标记。
ALTER DEFAULT PRIVILEGES [ FOR { ROLE | USER }target_role[, ...] ] [ IN SCHEMAschema_name[, ...] ]abbreviated_grant_or_revoke其中abbreviated_grant_or_revoke是下列之一: GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN } [, ...] | ALL [ PRIVILEGES ] } ON TABLES TO { [ GROUP ]role_name| PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON SEQUENCES TO { [ GROUP ]role_name| PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTIONS | ROUTINES } TO { [ GROUP ]role_name| PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPES TO { [ GROUP ]role_name| PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { USAGE | CREATE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAS TO { [ GROUP ]role_name| PUBLIC } [, ...] [ WITH GRANT OPTION ] GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTS TO { [ GROUP ]role_name| PUBLIC } [, ...] [ WITH GRANT OPTION ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN } [, ...] | ALL [ PRIVILEGES ] } ON TABLES FROM { [ GROUP ]role_name| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON SEQUENCES FROM { [ GROUP ]role_name| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTIONS | ROUTINES } FROM { [ GROUP ]role_name| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPES FROM { [ GROUP ]role_name| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | CREATE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAS FROM { [ GROUP ]role_name| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTS FROM { [ GROUP ]role_name| PUBLIC } [, ...] [ CASCADE | RESTRICT ]
描述
ALTER DEFAULT PRIVILEGES允许你设置将应用于未来创建对象的权限。(它不会影响已经存在的对象上已分配的权限。)权限既可以全局设置(即,对当前数据库中未来创建的所有对象生效),也可以只针对指定模式中未来创建的对象设置。
虽然你可以修改自己的默认权限,也可以修改你所属角色的默认权限,但在创建对象时,新对象的权限只受当前角色的默认权限影响,不会从当前角色所属的任何角色继承。
如第 5.8 节中所述,任何对象类型的默认权限通常都会将所有可授予的权限授予对象拥有者,并且也可能向PUBLIC授予某些权限。不过,这种行为可以通过 ALTER DEFAULT PRIVILEGES修改全局默认权限来改变。
当前,只有模式、表(包括视图和外部表)、序列、函数、类型(包括域)以及大对象的权限可以修改。对于此命令,函数包括聚合函数和过程。此命令中的FUNCTIONS和 ROUTINES等价。(今后更推荐使用ROUTINES,因为这是同时指代函数和过程的标准术语。在较早的PostgreSQL版本中,只允许使用FUNCTIONS。无法分别为函数和过程设置默认权限。)
按模式指定的默认权限会叠加到该对象类型的全局默认权限之上。这意味着,如果某项权限是在全局范围内授予的(无论是默认授予,还是根据此前未指定模式的ALTER DEFAULT PRIVILEGES命令授予的),就不能按模式将其撤销。按模式执行的REVOKE 只适用于抵消此前按模式执行的GRANT所产生的效果。
注解
示例
为你后续在模式myschema中创建的所有表(以及视图)向所有人授予 SELECT 权限,并且也允许角色webuser对它们执行 INSERT:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT INSERT ON TABLES TO webuser;
撤销上述操作,使后续创建的表不再拥有任何超出正常情况的权限:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE SELECT ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE INSERT ON TABLES FROM webuser;
移除通常会在函数上授予的公共 EXECUTE 权限,使后续由角色admin创建的所有函数不再自动具有该权限:
ALTER DEFAULT PRIVILEGES FOR ROLE admin REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
但请注意,你不能用仅限单个模式的命令实现这一效果。下面这条命令不会产生作用,除非它是在撤销与之对应的GRANT:
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
这是因为按模式设置的默认权限只能向全局设置增加权限,不能移除由全局设置授予的权限。
兼容性
在 SQL 标准中没有ALTER DEFAULT PRIVILEGES语句。
另见
语法演化
相邻大版本之间的差异,新的在前。版本号链接到对应快照。
PostgreSQL 19← 18正文更新
正文更新PostgreSQL 18← 17语法变化
+ TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]+ GRANT { { SELECT | UPDATE }+ [, ...] | ALL [ PRIVILEGES ] }+ ON LARGE OBJECTS+ REVOKE [ GRANT OPTION FOR ]+ { { SELECT | UPDATE }+ [, ...] | ALL [ PRIVILEGES ] }+ ON LARGE OBJECTS+ FROM { [ GROUP ] role_name | PUBLIC } [, ...]+ [ CASCADE | RESTRICT ]正文更新PostgreSQL 17← 16语法变化
+ GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }+ { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | MAINTAIN }正文更新PostgreSQL 16← 15正文更新
正文更新PostgreSQL 12← 11语法变化
+ GRANT { { USAGE | CREATE }+ [, ...] | ALL [ PRIVILEGES ] }+ { { USAGE | CREATE }+ [, ...] | ALL [ PRIVILEGES ] }正文更新PostgreSQL 11← 10语法变化
+ ON { FUNCTIONS | ROUTINES }+ ON { FUNCTIONS | ROUTINES }正文更新
同组命令
| 命令 | 动词 | 对象 | 版本变动 | 最近变更 |
|---|---|---|---|---|
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 | — | |
| 移除一个数据库角色 | 现存 | |||