# REVOKE
#### 功能描述
REVOKE用于撤销一个或多个角色的权限。
#### 注意事项
非对象所有者试图在对象上REVOKE权限，命令按照以下规则执行：
- 如果授权用户没有该对象上的权限，则命令立即失败。
- 如果授权用户有部分权限，则只撤销那些有授权选项的权限。
- 如果授权用户没有授权选项，REVOKE ALL PRIVILEGES形式将发出一个错误信息，而对于其他形式的命令而言，如果是命令中指定名字的权限没有相应的授权选项，该命令将发出一个警告。
- 不允许对表分区进行REVOKE操作，对分区表进行REVOKE操作会引起告警。
 
#### 语法格式
- 撤销指定表和视图上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ANALYZE | ANALYSE | VACUUM | ALTER | DROP }[, ...] 
      | ALL [ PRIVILEGES ] }
      ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  ![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/caution_3.0-zh-cn.png)
  避免对同一张表或视图（包括ON TABLE和ON ALL TABLES IN SCHEMA）执行并发GRANT/REVOKE操作，或者对同一张表或视图同时执行GRANT/REVOKE操作和DDL操作，否则会出现类似报错"tuple concurrently updated."。
  
- 撤销表上指定字段权限。
  ```
  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 ]
      { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] 
      | ALL [ PRIVILEGES ] }
      ON DATABASE database_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 撤销指定函数上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { EXECUTE | ALTER | DROP } [, ...] | 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 ]
      { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
      ON LARGE OBJECT loid [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 撤销指定序列上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { SELECT | UPDATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
      ON SEQUENCE sequence_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 撤销指定模式上权限。
  ```
  REVOKE [ GRANT OPTION FOR ]
      { { CREATE | USAGE | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] }
      ON SCHEMA schema_name [, ...]
      FROM { [ GROUP ] role_name | PUBLIC } [, ...]
      [ CASCADE | RESTRICT ];
  ```
  
- 撤销指定子集群上权限
  ```
  REVOKE [ GRANT OPTION FOR ]
      { CREATE | USAGE | COMPUTE | ALL [ PRIVILEGES ] }
      ON NODE GROUP group_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;
  ```
  
 
#### 参数说明
关键字PUBLIC表示一个隐式定义的拥有所有角色的组。REVOKE权限类别和参数说明，请参见GRANT的[参数说明](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0250.html#ZH-CN_TOPIC_0000002166613318__s226158f44a8f4b908e69a283aeb813cd)。
![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/note_3.0-zh-cn.png)
- 任何特定角色拥有的特权包括直接授予该角色的特权、从该角色作为其成员的角色中得到的权限以及授予给PUBLIC的权限。因此，从PUBLIC收回SELECT特权并不一定会意味着所有角色都会失去在该对象上的SELECT特权，那些直接被授予的或者通过另一个角色被授予的角色仍然会拥有它。类似地，从一个用户收回SELECT后，如果PUBLIC仍有SELECT权限，该用户还是可以使用SELECT。
- 依赖性权限：如用户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用户的sysadmin权限：
```
REVOKE ALL PRIVILEGES FROM joe;
```
撤销指定模式上授予的权限：
```
REVOKE USAGE,CREATE ON SCHEMA tpcds FROM tpcds_manager;
```
撤销joe用户的CONNECT特权：
```
REVOKE CONNECT ON DATABASE mydatabase FROM joe;
```
从用户joe撤销角色admins中的成员资格：
```
REVOKE admins FROM joe;
```
撤销用户joe对视图myView具有的所有特权：
```
REVOKE ALL PRIVILEGES ON myView FROM joe;
```
撤销针对表customer_t1的public插入特权：
```
REVOKE INSERT ON customer_t1 FROM PUBLIC;
```
撤销用户joe对模式tpcds的使用权限：
```
REVOKE USAGE ON SCHEMA tpcds FROM joe;
```
撤销用户joe对tpcds.reason表中r_reason_sk，r_reason_id的查询权限：
```
REVOKE select (r_reason_sk, r_reason_id) ON tpcds.reason FROM joe;
```
撤销用户joe对函数func_add_sql的执行权限：
```
REVOKE execute ON FUNCTION func_add_sql(integer, integer) FROM joe CASCADE;
```
#### 相关链接
[GRANT](https://support.huaweicloud.com/sqlreference-911-dws/dws_06_0250.html)
