REVOKE
大纲
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 function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS 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 ]
描述
REVOKE命令收回之前从一个或者更多角色 授予的特权。关键词PUBLIC隐式定义的全部角色的组。
特权类型的含义见GRANT命令的描述。
注意任何特定角色拥有的特权包括直接授予给它的特权、从它作为其成员的 角色中得到的特权以及授予给PUBLIC的特权。因此, 从PUBLIC收回SELECT特权并不一定会意味 着所有角色都会失去在该对象上的SELECT特权:那些直接被授 予的或者通过另一个角色被授予的角色仍然会拥有它。类似地,从一个用户 收回SELECT后,如果PUBLIC或者另一个 成员关系角色仍有SELECT权利,该用户还是可以使用 SELECT。
如果指定了GRANT OPTION FOR,只会回收该特权 的授予选项,特权本身不被回收。否则,特权及其授予选项都会被回收。
如果一个用户持有一个带有授予选项的特权并且把它授予给了其他用户, 那么被那些其他用户持有的该特权被称为依赖特权。如果第一个用户持有 的该特权或者授予选项正在被收回且存在依赖特权,指定 CASCADE可以连带回收那些依赖特权,不指定则会 导致回收动作失败。这种递归回收只影响通过可追溯到该 REVOKE命令的主体的用户链授予的特权。因此, 如果该特权经由其他用户授予给受影响用户,受影响用户可能实际上还 保留有该特权。
在回收一个表上的特权时,也会在该表的每一个列上自动回收对应的列 特权(如果有)。在另一方面,如果一个角色已经被授予一个表上的 特权,那么从个别的列上回收同一个特权将不会生效。
在回收一个角色中的成员关系时,GRANT OPTION被改 称为ADMIN OPTION,但行为是类似的。也要注意这种 形式的命令不允许噪声词GROUP。
注解
使用psql的\dp 命令能够显示在现有表和列上已被授予的特权。其格式可见GRANT。对于不是表的对象有其他\d 命令可以显示它们的特权。
用户只能回收由它直接授出的特权。例如,如果用户 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的特定角色。如果无法做到这一点 可能会导致回收超过你预期的特权,或者根本回收不了任何东西。