ALTER DEFAULT PRIVILEGES
ALTER DEFAULT PRIVILEGES — 定义默认访问权限
大纲
ALTER DEFAULT PRIVILEGES
[ FOR { ROLE | USER } target_role [, ...] ]
[ IN SCHEMA schema_name [, ...] ]
abbreviated_grant_or_revoke
其中abbreviated_grant_or_revoke为以下之一:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | 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
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 }
[, ...] | 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
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 允许设置将应用于将来创建的对象的权限。(它不影响已存在对象的权限。)目前只能更改模式、表(包括视图和外部表)、序列、函数和类型(包括域)的权限。
只能更改将由自己或自己所属的角色创建的对象的默认权限。这些权限可以全局设置(即,适用于当前数据库中创建的所有对象),也可以只针对指定模式中创建的对象设置。
如 GRANT 下所述,任何对象类型的默认权限通常会向对象所有者授予所有可授予的权限,也可能向 PUBLIC 授予一些权限。不过,可以通过使用 ALTER DEFAULT PRIVILEGES 更改全局默认权限来改变这种行为。
按模式指定的默认权限会叠加到该对象类型的全局默认权限之上。这意味着,如果某项权限是在全局范围内授予的(无论是默认授予,还是根据此前未指定模式的 ALTER DEFAULT PRIVILEGES 命令授予的),就不能按模式将其撤销。按模式执行的 REVOKE
只适用于抵消此前按模式执行的 GRANT 所产生的效果。
注解
使用 psql 的\ddp 命令获取现有默认权限分配的信息。权限值的含义与 GRANT 下对\dp 的说明相同。
如果你希望删除一个其默认权限已被修改的角色,则必须先撤销对其默认权限所做的更改,或者使用 DROP OWNED BY
去除该角色的默认权限条目。
示例
为你后续在模式 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 语句。