
# DWS如何REVOKE某用户的connect on database权限？
#### 业务场景
某业务中需要撤销指定用户u1连接某数据库的权限，在执行**REVOKE CONNECT ON DATABASE *gaussdb* FROM u1;**命令成功后，使用u1还能继续连接数据库，撤销权限没有生效。
#### 原因分析
若直接使用REVOKE CONNECT ON DATABASE gaussdb from u1命令撤销u1用户的权限不会生效，因为数据库的CONNECT权限授予了PUBLIC，需指定关键字PUBLIC实现。
- DWS提供了一个隐式定义的拥有所有角色的组PUBLIC，所有创建的用户和角色默认拥有PUBLIC所拥有的权限。要撤销或重新授予用户和角色对PUBLIC的权限，可通过在GRANT和REVOKE指定关键字PUBLIC实现。
- DWS会将某些类型的对象上的权限授予PUBLIC。默认情况下，对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC。以下这些对象的权限会授予PUBLIC：
  - 数据库的CONNECT权限。
  
  - CREATE TEMP TABLE权限。
  
  - 函数的EXECUTE特权。
  
  - 语言和数据类型（包括域）的USAGE特权。
   
- 对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。
 
#### 操作示例
撤销用户u1访问数据库gaussdb的权限：
1. 连接DWS集群的数据库gaussdb。 
   ```
   gsql -d gaussdb -p 8000 -h 192.168.x.xx -U dbadmin -W {password} -r
   gaussdb=>
   ```
   
   
2. 创建用户u1。 
   ```
   gaussdb=> CREATE USER u1 IDENTIFIED BY 'xxxxxxxx';
   ```
   
   
3. 确认用户u1可正常访问数据库gaussdb。 
   ```
   gsql -d gaussdb -p 8000 -h 192.168.x.xx -U u1 -W {password} -r
   gaussdb=>
   ```
   
   
4. 使用管理员用户dbadmin连接数据库gaussdb，执行REVOKE命令撤销public的connect on database权限。 
   ```
   gsql -d gaussdb -h 192.168.x.xx -U dbadmin -p 8000 -r
   ```
   ```
   gaussdb=> REVOKE CONNECT ON DATABASE gaussdb FROM public;
   REVOKE
   ```
   
   
5. 验证结果，使用u1连接数据库，显示如下信息表示用户u1的connect on database权限已成功撤销。 
   ```
   gsql -d gaussdb -p 8000 -h 192.168.x.xx -U u1 -W {password} -r
   gsql: FATAL:  permission denied for database "gaussdb"
   DETAIL:  User does not have CONNECT privilege.
   ```
   
   
 
