ALTER DEFAULT PRIVILEGES — 定义默认访问权限
ALTER DEFAULT PRIVILEGES [ FOR { ROLE | USER }target_role
[, ...] ] [ IN SCHEMAschema_name
[, ...] ]abbreviated_grant_or_revoke
whereabbreviated_grant_or_revoke
is one of: 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 ] 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 ]
ALTER DEFAULT PRIVILEGES
允许您设置将应用于未来创建对象的权限。(它不会影响已存在对象的权限分配。)权限可以全局设置(即应用于在当前数据库中创建的所有对象),或者仅针对在指定模式中创建的对象设置权限。
虽然您可以更改自己的默认权限和您所属角色的默认权限,但在对象创建时,新对象的权限仅受当前角色的默认权限影响,而不从当前角色中的任何角色继承权限。
如 第 5.8 节 中所解释的,任何对象类型的默认特权通常向对象所有者授予所有可授予的权限,并且也可能会向 PUBLIC
授予一些特权。然而,可以通过使用 ALTER DEFAULT PRIVILEGES
更改全球默认特权来改变这种行为。
目前,只能更改模式、表(包括视图和外键表)、序列、函数和类型(包括域)的特权。对于此命令,函数包括汇总和过程。单词 FUNCTIONS
和 ROUTINES
在此命令中是等效的。(ROUTINES
将被优先用于函数和过程合在一起的标准术语。在早期 PostgreSQL 版本中,只允许使用单词 FUNCTIONS
。无法单独设置函数和过程的默认特权。)
按模式指定的默认特权将添加到特定对象类型的全球默认特权中。这意味着如果全局授予了特权(通过默认授予或根据未指定模式的先前 ALTER DEFAULT PRIVILEGES
命令),那么您无法按模式吊销特权。按模式的 REVOKE
仅可用于逆转先前按模式的 GRANT
。
使用 psql 的 \ddp
命令获取有关默认特权现有分配的信息。特权显示的含义与 第 5.8 节 中为 \dp
解释的含义相同。
如果您想删除已经更改了默认特权的角色,则有必要逆转其默认特权中的更改,或使用 DROP OWNED BY
来摆脱该角色的默认特权条目。
向在架构 myschema
中随后创建的所有表(和视图)授予每个人选择权限,并允许角色 webuser
同时向其中插入数据
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;
角色 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
语句。