
# REVOKE
#### 功能描述
REVOKE用于撤销一个或多个角色的权限。
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
对业务系统用户进行权限授予或执行revoke操作时可能引发实例或业务异常，请谨慎操作。
#### 注意事项
非对象所有者试图在对象上REVOKE权限，命令按照以下规则执行：
- 如果授权用户没有该对象上的权限，则命令立即失败。
- 如果授权用户有部分权限，则只撤销那些有授权选项的权限。
- 如果授权用户没有授权选项，REVOKE ALL PRIVILEGES形式将发出一个错误信息，而对于其他形式的命令而言，如果是命令中指定名称的权限没有相应的授权选项，该命令将发出一个警告。
 
#### 语法格式
- 回收指定表或视图上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM }[, ...] 
      | 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 | COMMENT } ( column_name [, ...] )}[, ...] 
      | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
      ON [ TABLE ] table_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 回收指定序列上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { SELECT | UPDATE | ALTER | DROP | COMMENT }[, ...] 
      | 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 | ALTER | DROP | COMMENT } [, ...] 
      | 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 | DROP } [, ...] | ALL [PRIVILEGES] }
      ON CLIENT_MASTER_KEYS client_master_keys_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 回收指定列加密密钥上的权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { USAGE | DROP } [, ...] | ALL [PRIVILEGES]}
      ON COLUMN_ENCRYPTION_KEYS column_encryption_keys_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 回收指定目录上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { READ | WRITE | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] }
      ON DIRECTORY directory_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 | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
      ON FOREIGN SERVER server_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 回收指定函数上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | 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 ]
      { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
      ON { PROCEDURE {proc_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
         | ALL PROCEDURE 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 ]
      { { CREATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
      ON SCHEMA schema_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 回收指定表空间上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { CREATE  | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
      ON TABLESPACE tablespace_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 回收指定类型上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
     { { USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
      ON TYPE type_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 回收指定子集群上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { CREATE | USAGE | COMPUTE  | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] }
      ON NODE GROUP group_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  回收子集群的create权限时，会默认回收usage和compute权限。
  
- 回收package对象的权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
     { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [PRIVILEGES] }
     ON PACKAGE package_name [, ...]
     FROM {[GROUP] role_name | PUBLIC} [, ...]
     [ CASCADE | RESTRICT ];
  ```
  
- 按角色回收角色上的权限。
  ```
  REVOKE [ ADMIN OPTION FOR ]
      role_name [, ...] FROM role_name [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 回收角色上的sysadmin权限。
  ```
  REVOKE ALL { PRIVILEGES | PRIVILEGE } FROM role_name;
  ```
  
- 回收ANY权限。
  ```
  REVOKE [ ADMIN OPTION FOR ]
    { CREATE ANY TABLE | ALTER ANY TABLE | DROP ANY TABLE | SELECT ANY TABLE | INSERT ANY TABLE | UPDATE ANY TABLE |
    DELETE ANY TABLE | CREATE ANY SEQUENCE | CREATE ANY INDEX | CREATE ANY FUNCTION | EXECUTE ANY FUNCTION |
    CREATE ANY PACKAGE | EXECUTE ANY PACKAGE | CREATE ANY TYPE | ALTER ANY TYPE | DROP ANY TYPE | ALTER ANY SEQUENCE | DROP ANY SEQUENCE |
    SELECT ANY SEQUENCE | ALTER ANY INDEX | DROP ANY INDEX | CREATE ANY SYNONYM | DROP ANY SYNONYM | CREATE ANY TRIGGER | ALTER ANY TRIGGER |
    DROP ANY TRIGGER
   } [, ...]
    FROM [ GROUP ] role_name [, ...];
  ```
  
 
- 回收DATABASE LINK对象权限。
  ```
  REVOKE { CREATE | ALTER | DROP } [PUBLIC] DATABASE LINK FROM role_name;
  ```
  ![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  DATABASE LINK详细说明请见[DATABASE LINK](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0709.html#ZH-CN_TOPIC_0000002558946093)。
  

- 回收PUBLIC同义词的权限。
  ```
  REVOKE { CREATE | DROP } PUBLIC SYNONYM FROM role_name;
  ```
  通过内置角色（gs_role_public_synonym_create、gs_role_public_synonym_drop）的方式也可以实现回收PUBLIC同义词的权限。
  - 回收创建PUBLIC同义词权限：
    ```
    REVOKE gs_role_public_synonym_create FROM role_name；
    ```
    
  
  - 回收删除PUBLIC同义词权限：
    ```
    REVOKE gs_role_public_synonym_drop FROM role_name；
    ```
    
   
#### 参数说明
关键字PUBLIC表示一个隐式定义的拥有所有角色的组。
权限类别和参数说明，请参见GRANT的[参数说明](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0637.html#ZH-CN_TOPIC_0000002558946057__zh-cn_topic_0000002558215323_zh-cn_topic_0059778755_s3557d45c54124d86bc3f619358d806f8)。
任何特定角色拥有的特权包括直接授予该角色的特权、从该角色作为其成员的角色中得到的权限以及授予给PUBLIC的权限。因此，从PUBLIC收回SELECT特权并不一定会意味着所有角色都会失去在该对象上的SELECT特权，那些直接被授予的或者通过另一个角色被授予的角色仍然会拥有它。类似地，从一个用户收回SELECT后，如果PUBLIC仍有SELECT权限，该用户还是可以使用SELECT。
指定GRANT OPTION FOR时，只撤销对该权限授权的权力，而不撤销该权限本身。
如用户A拥有某个表的UPDATE权限，及WITH GRANT OPTION选项，同时A把这个权限赋予了用户B，则用户B持有的权限称为依赖性权限。当用户A持有的权限或者授权选项被撤销时，依赖性权限仍然存在，但如果声明了CASCADE，则所有依赖性权限都被撤销。
一个用户只能撤销由它自己直接赋予的权限。例如，如果用户A被指定授权（WITH ADMIN OPTION）选项，且把一个权限赋予了用户B，然后用户B又赋予了用户C，则用户A不能直接将C的权限撤销。但是，用户A可以撤销用户B的授权选项，并且使用CASCADE。这样，用户C的权限就会自动被撤销。另外一个例子：如果A和B都赋予了C同样的权限，则A可以撤销他自己的授权选项，但是不能撤销B的，因此C仍然拥有该权限。
如果执行REVOKE的角色持有的权限是通过多层成员关系获得的，则具体是哪一个包含的角色执行的该命令是不确定的。在这种场合下，建议的方法是使用SET ROLE成为特定角色，然后执行REVOKE，否则可能导致删除了不想删除的权限，或者是任何权限都没有删除。
#### 示例
- 从用户joe收回角色jerry的权限。
  ```
  --创建角色jerry。
  gaussdb=# CREATE role jerry PASSWORD 'xxxxxxxxxx';
  --将create any table权限授权给jerry,并允许该角色将权限授权给其他人。
  gaussdb=# GRANT create any table TO jerry with admin option;
  --创建用户joe，将角色jerry的权限授权给该用户。
  gaussdb=#  CREATE user joe PASSWORD 'xxxxxxxxxxx';
  gaussdb=#  GRANT jerry TO joe;
  --从用户joe收回角色jerry的权限。
  gaussdb=#  REVOKE jerry FROM joe;
  ```
  

- 从用户tom收回系统权限。
  ```
  --创建用户tom。
  gaussdb=# CREATE USER tom PASSWORD 'xxxxxxxxxx';
  --给tom用户授予系统权限。
  gaussdb=# GRANT ALL PRIVILEGES TO tom;
  --从用户tom收回系统权限。
  gaussdb=# REVOKE ALL PRIVILEGES FROM tom;
  ```
  

- 从用户joe收回对模式tpcds下表reason的SELECT权限。
  ```
  --创建tpcds模式。
  gaussdb=# CREATE SCHEMA tpcds;
  --在tpcds模式下创建reason表。
  gaussdb=# CREATE TABLE tpcds.reason (
  r_reason_sk         INTEGER      NOT NULL,
  r_reason_id         CHAR(16)     NOT NULL,
  r_reason_desc       VARCHAR(20)
  );
  --将tpcds.reason表查询权限授权给joe。
  gaussdb=# GRANT select ON tpcds.reason TO joe;
  --从用户joe收回对模式tpcds下表reason的SELECT权限。
  gaussdb=# REVOKE SELECT ON TABLE tpcds.reason FROM joe;
  ```
  

- 从用户joe收回对模式tpcds下函数fun1()的ALTER权限。
  ```
  --创建fun1()函数。
  gaussdb=# CREATE or replace FUNCTION tpcds.fun1() RETURN boolean AS
  BEGIN
  SELECT current_user;
  RETURN true;
  END;
  /
  --给joe用户授予对fun1()的ALTER权限。
  gaussdb=# GRANT ALTER ON FUNCTION tpcds.fun1() TO joe;
  --从用户joe收回对模式tpcds下函数fun1的ALTER权限。
  gaussdb=#  REVOKE ALTER ON FUNCTION tpcds.fun1() FROM joe;
  ```
  
- 从用户joe收回对数据库testdb的CONNECT权限。
  ```
  --创建数据库testdb。
  gaussdb=# CREATE DATABASE testdb;
  --给joe用户授予连接testdb的权限。
  gaussdb=# GRANT connect on database testdb TO joe WITH GRANT OPTION;
  --从用户joe收回对数据库testdb的CONNECT权限。
  gaussdb=# REVOKE CONNECT ON database testdb FROM joe;
  ```
  
- 清除数据。
  ```
  gaussdb=# DROP TABLE tpcds.reason;
  gaussdb=# DROP FUNCTION tpcds.fun1();
  gaussdb=# DROP SCHEMA tpcds CASCADE;
  gaussdb=# DROP USER joe;
  gaussdb=# DROP USER tom;
  gaussdb=# REVOKE create any table FROM jerry;
  gaussdb=# DROP ROLE jerry;
  gaussdb=# DROP DATABASE testdb;
  ```
  
 
#### 相关链接
[GRANT](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0637.html#ZH-CN_TOPIC_0000002558946057)
