REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE dbname [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ] role [, ...] FROM { username | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
REVOKE 撤销以前赋予一个或多个角色的权限。 关键字 PUBLIC 代表隐含定义的拥有所有角色的组。
请注意,任何特定的角色都将拥有直接赋予他/她的权限,加上他/她所处的任何组, 以及再加上赋予 PUBLIC 的权限的总和。因此,举例来说,废止 PUBLIC 的 SELECT 权限并不意味着所有角色都失去了对该对象的 SELECT 权限: 那些直接得到权限赋予的以及通过一个组得到权限的角色仍然拥有该权限。
参阅 GRANT 命令的描述获取权限类型的含义。
如果声明了 GRANT OPTION FOR,那么只是撤销对该权限的授权的权力,而不是撤销该权限本身。 否则,权限和授权选项都被撤销。
如果一个用户持有某项权限,并且还有授权的选项,并且还把这个权限赋予了其他用户, 那么那些其他用户持有的权限都叫做依赖性权限。 如果第一个用户持有的权限或者授权选项被撤销,而依赖性权限仍然存在, 那么如果我们声明了 CASCADE,则所有依赖性权限都被撤销, 否则撤销动作就会失败。这个递规的撤销只影响那种通过一个用户链赋予的权限, 这个链条可以通过这条 REVOKE 命令里面给出的用户追踪。 因此,如果权限本身是通过其他用户赋予的, 那么被影响的用户可以有效地保留这个权限。
在撤销一个角色里的成员关系的时候,不是调用 ADMIN OPTION, 而是调用 GRANT OPTION,但是行为类似。
使用 psql 的 \z 命令显示在一个现存对象上赋予的权限。 又见 GRANT 获取关于格式的信息。
一个用户只能撤销由它自己直接赋予的权限。举例来说,如果用户 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 的指定的角色。 不这么做的后果是导致删除你不想删除的权限,或者是啥权限都没有删除。
撤销公众在表 films 上的插入权限:
REVOKE INSERT ON films FROM PUBLIC;
废除用户 manuel 对视图 kinds 的所有权限:
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
请注意这样实际上意味着"撤销所有我赋予的权限"。
删除用户 joe 的 admins 成员关系角色:
REVOKE admins FROM joe;
GRANT 命令的兼容性信息基本上也适用于 REVOKE。语法概要是:
REVOKE [ GRANT OPTION FOR ] privileges ON object [ ( column [, ...] ) ] FROM { PUBLIC | username [, ...] } { RESTRICT | CASCADE }
标准要求 RESTRICT 或者 CASCADE 之一必须出现, 但是 PostgreSQL 假设缺省是 RESTRICT。