====== REVOKE ====== .. container:: refentry :name: SQL-REVOKE .. container:: titlepage .. container:: refnamediv .. rubric:: REVOKE :name: revoke REVOKE — 移除访问特权 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) } ON [ TABLE ] table_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCE sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN domain_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER fdw_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVER server_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { { FUNCTION | PROCEDURE | ROUTINE } function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE lang_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT loid [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespace_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPE type_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ] role_name [, ...] FROM role_name [, ...] [ CASCADE | RESTRICT ] .. container:: refsect1 :name: SQL-REVOKE-DESCRIPTION .. rubric:: 描述 :name: 描述 ``REVOKE``\ 命令收回之前从一个或者更多角色 授予的特权。关键词\ ``PUBLIC``\ 隐式定义的全部角色的组。 特权类型的含义见\ `GRANT `__\ 命令的描述。 注意任何特定角色拥有的特权包括直接授予给它的特权、从它作为其成员的 角色中得到的特权以及授予给\ ``PUBLIC``\ 的特权。因此, 从\ ``PUBLIC``\ 收回\ ``SELECT``\ 特权并不一定会意味 着所有角色都会失去在该对象上的\ ``SELECT``\ 特权:那些直接被授 予的或者通过另一个角色被授予的角色仍然会拥有它。类似地,从一个用户 收回\ ``SELECT``\ 后,如果\ ``PUBLIC``\ 或者另一个 成员关系角色仍有\ ``SELECT``\ 权利,该用户还是可以使用 ``SELECT``\ 。 如果指定了\ ``GRANT OPTION FOR``\ ,只会回收该特权 的授予选项,特权本身不被回收。否则,特权及其授予选项都会被回收。 如果一个用户持有一个带有授予选项的特权并且把它授予给了其他用户, 那么被那些其他用户持有的该特权被称为依赖特权。如果第一个用户持有 的该特权或者授予选项正在被收回且存在依赖特权,指定 ``CASCADE``\ 可以连带回收那些依赖特权,不指定则会 导致回收动作失败。这种递归回收只影响通过可追溯到该 ``REVOKE``\ 命令的主体的用户链授予的特权。因此, 如果该特权经由其他用户授予给受影响用户,受影响用户可能实际上还 保留有该特权。 在回收一个表上的特权时,也会在该表的每一个列上自动回收对应的列 特权(如果有)。在另一方面,如果一个角色已经被授予一个表上的 特权,那么从个别的列上回收同一个特权将不会生效。 在回收一个角色中的成员关系时,\ ``GRANT OPTION``\ 被改 称为\ ``ADMIN OPTION``\ ,但行为是类似的。也要注意这种 形式的命令不允许噪声词\ ``GROUP``\ 。 .. container:: refsect1 :name: SQL-REVOKE-NOTES .. rubric:: 注解 :name: 注解 用户只能回收由它直接授出的特权。例如,如果用户 A 已经把一个带有 授予选项的特权授予给了用户 B,并且用户 B 接着把它授予给了用户 C, 那么用户 A 无法直接从 C 收回该特权。反而,用户 A 可以从用户 B 收回 该授予选项并且使用\ ``CASCADE``\ 选项,这样该特权会被 依次从用户 C 回收。对于另一个例子,如果 A 和 B 都把同一个特权授予 给了 C,A 能够收回它们自己的授权但不能收回 B 的授权,因此 C 实际上 仍将拥有该特权。 当一个对象的非拥有者尝试\ ``REVOKE``\ 该对象上的特权时, 如果该用户在该对象上什么特权都不拥有,该命令会立刻失败。只要有某个 特权可用,该命令将继续,但是它只会收回那些它具有授予选项的特权。 如果没有持有授予选项,\ ``REVOKE ALL PRIVILEGES``\ 形式 将发出一个警告,而其他形式在没有持有该命令中特别提到的任何特权的 授予选项时就会发出警告(原则上,这些语句也适用于对象拥有者,但是 由于拥有者总是被认为持有所有授予选项,这些情况永远不会发生)。 如果一个超级用户选择发出一个\ ``GRANT``\ 或者 ``REVOKE``\ 命令,该命令就好像被受影响对象的拥有者发出 的一样被执行。因为所有特权最终来自于对象拥有者(可能是间接地通过 授予选项链),可以由超级用户收回所有特权,但是这可能需要前述的 ``CASCADE``\ 。 ``REVOKE``\ 也可以由一个并非受影响对象的拥有者的角色 完成,但是该角色应该是一个拥有该对象的角色的成员或者是一个在该对象 上拥有特权的\ ``WITH GRANT OPTION``\ 的角色的成员。 在这种情况中,该命令就好像被实际拥有该对象或者特权的 ``WITH GRANT OPTION``\ 的包含角色发出的一样被执行。 例如,如果表\ ``t1``\ 被角色\ ``g1``\ 拥有,而\ ``u1`` 是\ ``g1``\ 的一个成员,那么\ ``u1``\ 能收回\ ``t1`` 上被记录为由\ ``g1``\ 授出的特权。这会包括由\ ``u1`` 以及由角色\ ``g1``\ 的其他成员完成的授予。 如果执行\ ``REVOKE``\ 的角色持有通过多于一条角色成员 关系路径间接得到的特权,其中哪一条包含将被用于执行该命令的 角色是没有被指明的。在这种情况中,最好使用 ``SET ROLE``\ 成为你想作为其身份执行 ``REVOKE``\ 的特定角色。如果无法做到这一点 可能会导致回收超过你预期的特权,或者根本回收不了任何东西。 关于特定权限类型的更多信息请参加 `第 5.7 节 `__ , 以及如何检查对象的权限。 .. container:: refsect1 :name: SQL-REVOKE-EXAMPLES .. rubric:: 示例 :name: 示例 从 public 收回表\ ``films``\ 上的插入特权: .. code:: programlisting REVOKE INSERT ON films FROM PUBLIC; 从用户\ ``manuel``\ 收回视图 ``kinds``\ 上的所有特权: .. code:: programlisting REVOKE ALL PRIVILEGES ON kinds FROM manuel; 注意着实际意味着“收回所有我授出的特权”。 从用户\ ``joe``\ 收回角色\ ``admins``\ 中的成员关系: .. code:: programlisting REVOKE admins FROM joe; .. container:: refsect1 :name: SQL-REVOKE-COMPATIBILITY .. rubric:: 兼容性 :name: 兼容性 `GRANT `__\ 命令的兼容性注解同样适用于 ``REVOKE``\ 。根据标准,关键词 ``RESTRICT``\ 或\ ``CASCADE`` 是必要的,但是PostgreSQL默认假定为 ``RESTRICT``\ 。 .. container:: refsect1 :name: id-1.9.3.165.9 .. rubric:: 另见 :name: 另见 `GRANT `__, `ALTER DEFAULT PRIVILEGES `__