更新时间:2025-05-29 GMT+08:00
        
          
          
        
      
      
      
      
      
      
      
      
  
      
      
      
        
为什么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的权限,并授予权限给其他用户。
 
具体示例如下:
- 创建用户u1和数据库db_test。
   
gaussdb=# CREATE USER u1 PASSWORD '********'; gaussdb=# CREATE DATABASE db_test;
 - 测试确定u1用户可以正常连接数据库test。后退出数据库。
   
gsql -d db_test -h xxx.xxx.xxx.xxx -p xxxx -U u1 -W '********'
 - 执行REVOKE命令撤销public连接db_test的权限。
   
gaussdb=# REVOKE CONNECT ON DATABASE db_test FROM public; - 验证结果,使用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;
 
   父主题: FAQ