
# 为什么REVOKE某个用户的CONNECT ON DATABASE权限后还可以登录数据库？
答：使用REVOKE CONNECT ON DATABASE dbname FROM u1命令撤销u1的权限后，因为数据库的CONNECT权限授予了public，需要指定public来实现。
- GaussDB提供了一个隐式定义的拥有所有角色组public，所有创建的用户和角色默认拥有public所拥有的权限。需要撤销或重新授予用户和角色public的权限，可通过GRANT和REVOKE指定关键字public实现。
- GaussDB会将某些类型的对象上的权限授予public。默认情况以下这些对象的权限会授予public：
  - 数据库的CONNECT权限。
  
  - CREATE TEMP TABLE权限。
  
  - 函数的EXECUTE权限。
  
  - 语言和数据类型（包括域）的USAGE权限。
   
- 对象的拥有者可以撤销默认授予public的权限，并授予权限给其他用户。
具体示例如下：
1. 创建用户u1和数据库db_test。
   ```
   gaussdb=# CREATE USER u1 PASSWORD '********';
   gaussdb=# CREATE DATABASE db_test;
   ```
   
2. 测试确定u1用户可以正常连接数据库test。后退出数据库。
   ```
   gsql -d db_test -h xxx.xxx.xxx.xxx -p xxxx -U u1 -W '********'
   ```
   
3. 执行REVOKE命令撤销public连接db_test的权限。
   ```
   gaussdb=# REVOKE CONNECT ON DATABASE db_test FROM public;
   ```
   
4. 验证结果，使用u1连接数据库。结果显示u1用户已经无法连接数据库。
   ```
   gsql -d db_test -h xxx.xxx.xxx.xxx -p xxxx -U u1 -W '********'
   gsql: FATAL:  permission denied for database "db_test"
   DETAIL:  User does not have CONNECT privilege.
   --删除。
   gaussdb=# DROP USER u1;
   gaussdb=# DROP DATABASE db_test;
   ```
   
 
