PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

ALTER DEFAULT PRIVILEGES

ALTER DEFAULT PRIVILEGES — 定义默认访问特权

Synopsis

ALTER DEFAULT PRIVILEGES
    [ FOR { ROLE | USER } target_role [, ...] ]
    [ IN SCHEMA schema_name [, ...] ]
    abbreviated_grant_or_revoke

where abbreviated_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 ]

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 允许你设置将来应用于被创建对象的特权。(它不影响已经分配给现有对象的特权。)特权可以被全局地设置(即对在当前数据库中创建的所有对象),也可以只对在指定模式中创建的对象设置。

虽然你可以更改自己的默认特权以及你作为成员的角色的默认特权,但在创建对象时,新对象的权限只受当前角色的默认特权影响,而不会从当前角色作为成员的任何角色继承。

如 Section 5.8 中所解释的,任何对象类型的默认特权通常会把所有可授予的权限授予对象拥有者,并且也可能把一些特权授予 PUBLIC。不过,通过用 ALTER DEFAULT PRIVILEGES 更改全局默认特权,可以改变这种行为。

目前,只有模式、表(包括视图和外部表)、序列、函数、类型(包括域)以及大对象的特权可以被更改。对于这个命令,函数包括聚集函数和过程。在这个命令中,FUNCTIONS 和 ROUTINES 这两个词是等价的。(作为函数和过程合在一起的标准术语,今后首选 ROUTINES。在早期的 PostgreSQL 版本中,只允许使用 FUNCTIONS 这个词。无法为函数和过程分别设置默认特权。)

针对每个模式指定的默认特权会被添加到该特定对象类型的全局默认特权之上。这意味着,如果特权是全局授予的(无论是默认授予,还是根据之前一条没有指定模式的 ALTER DEFAULT PRIVILEGES 命令授予的),你就不能针对单个模式撤销它们。针对每个模式的 REVOKE 只用于撤销之前针对该模式的 GRANT 所产生的效果。

参数

target_role

更改由 target_role 创建的对象的默认特权;如果未指定,则为当前角色。

schema_name

一个现有模式的名称。如果指定了它,则会为以后在该模式中创建的对象更改默认特权。如果省略了 IN SCHEMA,则更改全局默认特权。在为模式和大对象设置特权时不允许使用 IN SCHEMA,因为模式不能嵌套,而大对象不属于任何模式。

role_name

要为其授予或撤销特权的现有角色的名称。此参数以及 abbreviated_grant_or_revoke 中的所有其他参数的行为如 GRANT 或 REVOKE 中所述,不同之处在于这里是为整个一类对象设置权限,而不是为特定的命名对象设置权限。

注记

使用 psql 的 \ddp 命令可以获取关于现有默认特权分配的信息。特权显示的含义与对 \dp 的解释相同,详见 Section 5.8。

如果你希望删除一个已经被更改过默认特权的角色,必须先撤销对其默认特权的更改,或者使用 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;

对于角色 admin 以后创建的所有函数,移除通常在函数上授予的公共 EXECUTE 权限:

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 语句。

另请参阅

GRANT, REVOKE