数据仓库服务 GAUSSDB(DWS)-用户存在依赖关系无法删除如何处理:处理方法

时间:2024-11-02 18:44:29

处理方法

  • 要删除的用户为一个数据库的owner,需要将对象的所有权重新分配给其他用户。有以下两种处理方法:
    方式一:将数据库owner转移给其他用户。例如,使用ALTER语句将数据库testdb的owner用户u1修改为u2。
    1
    2
    3
    4
    5
    6
    7
    8
    testdb=# ALTER DATABASE testdb OWNER to u2;
    ALTER DATABASE
    testdb=# \l 
                                       List of databases    
       Name    |   Owner  | Encoding |   Collate   |    Ctype    |    Access privileges 
    -----------+----------+----------+-------------+-------------+------------------------- 
     testdb    | u2       | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
    (4 rows) 
    
    执行删除u1用户的命令,不再提示“owner of database testdb”的信息。
    1
    2
    3
    testdb=# DROP USER u1;
    ERROR:  role "u1" cannot be dropped because some objects depend on it 
    DETAIL:  3 objects in database gaussdb
    
    方式二:如果已确认不需要数据库testdb,也可直接将其删除。将所有u1拥有的数据库对象的属主更改为u2。
    1
    2
    testdb=# REASSIGN OWNED BY u1 TO u2;
    REASSIGN OWNED
    

    清理owner是u1的对象。请谨慎使用,会将用户同名的schema也一同清理掉。

    1
    2
    testdb=# DROP OWNED by u1;
    DROP OWNED
    
  • 要删除的用户存在依赖关系,需要解除依赖关系。处理方法如下:
    1. 识别依赖关系。根据报错信息“3 objects in database gaussdb”可知gaussdb数据库里有3个对象依赖u1。由于数据库内系统表的依赖,在其他数据库中不会打印出详细的依赖对象信息,那么在gaussdb库中执行DROP USER的时候,会打印出具体的信息。

      连接到gaussdb库执行如下命令:

      1
      2
      3
      4
      gaussdb=# DROP USER u1;
      ERROR:  role "u1" cannot be dropped because some objects depend on it
      DETAIL:  privileges for table pg_class
      privileges for schema u2
      

      获取到依赖项的详细信息如下:

      1. privileges for table pg_class:pg_class上u1用户的权限。
      2. schema u2上u1用户的权限。
    2. 撤销依赖对象的权限。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      gaussdb=# SELECT relname,relacl FROM pg_class WHERE relname = 'pg_class';
       relname  |              relacl
      ----------+----------------------------------
       pg_class | {=r/Ruby,u1=r/Ruby}
      (1 row)
      
      gaussdb=#SELECT nspname,nspacl FROM pg_namespace WHERE nspname = 'u2';
       nspname |           nspacl
      ---------+-----------------------------
       u2      | {u2=UC/u2,u2=LP/u2,u1=U/u2}
      
      gaussdb=# REVOKE SELECT ON TABLE pg_class FROM u1;
      REVOKE
      gaussdb=# REVOKE USAGE ON SCHEMA u2 FROM u1;
      REVOKE
      
    3. 再删除用户,可成功删除,不再提示有依赖。
      1
      2
      gaussdb=# DROP USER u1;
      DROP USER
      
support.huaweicloud.com/trouble-dws/dws_09_0108.html