ALTER DEFAULT PRIVILEGES

From PostgreSQL wiki
Jump to navigationJump to search
名字

ALTER DEFAULT PRIVILEGES -- 定义缺省访问权限

语法概要
   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 }
           [, ...] | 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 ]
   
   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 ]
描述

ALTER DEFAULT PRIVILEGES 命令修改对象权限,执行之后所创建的对象都将使用这个权限。(这个操作不会影响已赋予权限的已有对象。)目前,只有表(包括视图和外部表)、 序列和函数的权限可以更改。

你可以为你自己或你所具备的角色将要创建的对象更改缺省权限。权限可以设置为全局的 (例如:在当前数据库中创建的所有对象),或者仅仅针对特定模式中的对象设置。 每个模式特定的缺省权限被合并到特定对象类型的全局缺省权限中。

正如 GRANT 表述的,一般来说,任意对象类型的缺省权限会为对象的所有者授予所有可赋予的权限,同时可能也会向 PUBLIC 授予一些权限。 然而,这个默认行为可以通过 ALTER DEFAULT PRIVILEGES 改变全局缺省权限来改变。

参数
target_role
已有角色的名称,当前角色需要是这个角色的成员。如果没有指定 FOR ROLE,那么就假定是当前角色。
schema_name
现有模式的名称。每个 'target_role' 必须在每个指定的模式上具有 CREATE权限。如果没有指定 IN SCHEMA,那么被修改的会是全局缺省权限。
role_name
被授予或者撤消权限的现有角色的名称。该参数和'abbreviated_grant_or_revoke'参数集下的所有参数,与 GRANTREVOKE 命令中的作用相似,所不同的是这里设置的是某一类所有对象的权限,而不是设置某个特定命名对象的权限。
注意

使用 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;

对随后角色admin创建的所有函数,撤销其在PUBLIC上的EXECUTE权限(一般情况下是授予的):

   ALTER DEFAULT PRIVILEGES FOR ROLE admin REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
兼容性

SQL标准里没有 ALTER DEFAULT PRIVILEGES 语句。

参见

GRANT, REVOKE