======================== ALTER DEFAULT PRIVILEGES ======================== .. container:: refentry :name: SQL-ALTERDEFAULTPRIVILEGES .. container:: titlepage .. container:: refnamediv .. rubric:: ALTER DEFAULT PRIVILEGES :name: alter-default-privileges ALTER DEFAULT PRIVILEGES — 定义默认访问特权 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis 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 | 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 } [, ...] | 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 ] .. container:: refsect1 :name: SQL-ALTERDEFAULTPRIVILEGES-DESCRIPTION .. rubric:: 描述 :name: 描述 ``ALTER DEFAULT PRIVILEGES``\ 允许你设置将被应用于未来要创建的对象的特权(它不会影响分配给已经存在的对象的特权)。当前,只能修改用于模式、表(包括视图和外部表)、序列、函数和类型(包括域)的特权。其中,可设置权限的函数包括聚集函数和过程函数。当这个命令应用于函数时,单词\ ``FUNCTIONS``\ 和\ ``ROUTINES``\ 是等效的。(推荐使用\ ``ROUTINES``\ ,因为它是用来囊括函数和过程的一个标准术语。在较早的PostgreSQL发行版中,只允许单词\ ``FUNCTIONS``\ 。无法为函数或过程单独设置默认特权。) 你只能改变你自己或者你属于其中的角色所创建的对象的默认特权。这些特权可以对全局范围设置(即对当前数据库中创建的所有对象),或者只对在指定模式中创建的对象设置。 如\ `第 5.7 节 `__\ 中所述,用于任何对象类型的默认特权通常会把所有可授予的权限授予给对象拥有者,并且也可能授予一些特权给\ ``PUBLIC``\ 。不过,这种行为可以通过使用\ ``ALTER DEFAULT PRIVILEGES``\ 修改全局默认特权来改变。 每个模式规定的默认权限将添加到特定对象类型的全局默认特权的内容中。 这意味着你不能撤销每个模式的特权,如果它们已经被全局授予(默认情况下,或者根据以前未规定模式的\ ``ALTER DEFAULT PRIVILEGES``\ 命令)。 每个模式的\ ``REVOKE``\ 仅用于反转以前每个模式\ ``GRANT``\ 的影响。 .. container:: refsect2 :name: id-1.9.3.8.5.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist ``target_role`` 一个现有角色的名称,当前角色是它的一个成员。如果\ ``FOR ROLE``\ 被忽略,将假定为当前角色。 ``schema_name`` 一个现有模式的名称。如果被指定,以后在那个模式中创建的对象的默认特权会被修改。如果\ ``IN SCHEMA``\ 被忽略,全局默认特权会被修改。 当设置特权给模式时不能使用\ ``IN SCHEMA``\ ,因为模式不能嵌套。 ``role_name`` 要为其授予或者收回特权的一个现有角色的名称。这个参数以及所有\ *``abbreviated_grant_or_revoke``*\ 中的其他参数会按照\ `GRANT `__\ 或者\ `REVOKE `__\ 中描述的方式运作,不过这里是为一整类的对象而不是特别指定的对象设置权限。 .. container:: refsect1 :name: SQL-ALTERDEFAULTPRIVILEGES-NOTES .. rubric:: 注解 :name: 注解 使用\ `psql `__\ 的\ ``\ddp``\ 命令可以获得关于默认特权的现有分配信息。 特权显示的含义和\ `第 5.7 节 `__\ 中的\ ``\dp``\ 描述的相同。 如果你希望删除一个默认特权被修改的角色,有必要撤销其默认特权上的改变或者使用\ ``DROP OWNED BY``\ 来为该角色去除默认特权项。 .. container:: refsect1 :name: SQL-ALTERDEFAULTPRIVILEGES-EXAMPLES .. rubric:: 例子 :name: 例子 为你后续在模式\ ``myschema``\ 中创建的所有表(和视图)授予 SELECT 特权,并且也允许角色\ ``webuser``\ 向它们之中 INSERT 数据: .. code:: programlisting ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT INSERT ON TABLES TO webuser; 撤销上面的动作,因此后续创建的表不会有任何不寻常的权限: .. code:: programlisting 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 权限: .. code:: programlisting ALTER DEFAULT PRIVILEGES FOR ROLE admin REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; 但是注意你\ *不能*\ 使用限制为单个模式的命令来实现该效果。 此命令不起作用,除非它撤消匹配的\ ``GRANT``\ : .. code:: programlisting ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC; 这是因为每个模式的默认特权只能向全局设置添加特权,而不能移除它授予的特权。 .. container:: refsect1 :name: id-1.9.3.8.8 .. rubric:: 兼容性 :name: 兼容性 在 SQL 标准中没有\ ``ALTER DEFAULT PRIVILEGES``\ 语句。 .. container:: refsect1 :name: id-1.9.3.8.9 .. rubric:: 参见 :name: 参见 `GRANT `__, `REVOKE `__