数据库中用户删除不掉总是报错,依赖如何处理干净?

数据库,用户,删除,不掉,总是,报错,依赖,如何,处理,干净 · 浏览次数 : 51

小编点评

**用户依赖识别与清理** 用户在离职或角色变更时需要进行账号销户,而权限也需要进行回收。由于用户依赖关系比较多,手动清理权限可能很困难,因此建议使用数据库提供的权限管理功能进行清理。 **权限管理方式** 华为云数据库提供以下两种权限管理方式: * **角色权限:**为用户分配特定的角色,赋予其所需的权限。 * **授权:**为用户分配特定的权限,并指定其可访问的数据库对象和操作。 **用户依赖识别与清理步骤** 1. **识别依赖关系:**在用户删除之前,查询其账号在数据库中的所有依赖关系。 2. **清理依赖关系:**根据依赖关系,将相关用户或对象删除或赋予新的权限。 3. **释放对象权限:**将用户从所有数据库对象中移除权限。 4. **删除用户权限:**如果用户没有任何依赖关系,将其从所有数据库对象中删除。 **示例** 假设用户 "test1" 在 "postgres" 数据库中拥有以下权限: ``` GRANT SELECT ON pg_classprivileges FOR schema 'grantor' TO 'test1'; GRANT SELECT ON pg_class FOR schema 'pg_namespace' TO 'test1'; ``` 如果用户 "test2" 在 "postgres" 数据库中拥有以下权限: ``` GRANT SELECT ON pg_classprivileges FOR schema 'grantor' TO 'test2'; ``` 在用户 "test1" 被删除后,其权限将被清理,但 "pg_class" 和 "pg_namespace" 仍然保留,因为它们不是直接依赖用户 "test1" 的对象。 **注意事项** * 用户权限的清理过程可能需要一些时间,具体取决于数据库的大小和数据量。 * 确保在进行权限清理之前备份数据,以防意外。

正文

摘要:本文主要介绍如何进行用户的各种依赖识别与清理,并简单介绍下推荐的权限管理方式。

本文分享自华为云社区《GaussDB(DWS) 用户删除不掉时候总是报错,依赖如何处理干净?》,作者:Malick 。

数据库的使用中,有时会遇到某些用户离职,或者角色变更时,要对其账号进行销户,权限进行回收等操作。此时如果各种对象的权限比较复杂,依赖较多,是很难顺利直接清理掉该用户的。

本文主要介绍如何进行用户的各种依赖识别与清理,并简单介绍下推荐的权限管理方式。

postgres类数据库经常碰到的问题 – role “test1” cannot be dropped because some objects depend on it

如下图所示,要删除用户test1时,出现如下提示:

testdb=# drop user test1;
ERROR:  role "test1" cannot be dropped because some objects depend on it
DETAIL:  owner of database testdb
3 objects in database postgres

ERROR的提示信息说明:

  • 当前用户时testdb这个数据库的owner
  • 有3个依赖的对象在postgres数据库中

OK,那么我们就按照提示信息来一次处理

首先,当前用户是一个数据库的owner,那么有以下两种处理办法

方法一、将数据库owner转移给其他用户,例如如下转移给grantor用户

testdb=# alter database testdb owner to grantor;
ALTER DATABASE
testdb=# \l
                                   List of databases
   Name    |   Owner   | Encoding |   Collate   | Ctype |    Access privileges
-----------+-----------+----------+-------------+-------------+-------------------------
 testdb | grantor   | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
(4 rows)
-- 可以看到删除后,不会再报owner database的信息
testdb=# drop user test1;
ERROR:  role "test1" cannot be dropped because some objects depend on it
DETAIL: 3 objects in database postgres

方法二、如果不需要该库,也可以直接将其删除

PS:对于非数据库的对象:表或者schema等,可以使用如下方法将其全部转移给其他用户

-- owner转移
testdb=#  REASSIGN OWNED BY test1 TO grantor;
REASSIGN OWNED
-- 清理owner是test1的对象,慎用,会将用户同名的schema也一同清理掉。
testdb=# drop owned by test1;
DROP OWNED

接下来,我们owner的提示信息已经处理完了,处理下一步提示:3 objects in database postgres

这个意思是,在postgres里面有3个对象有依赖该用户。由于库内系统表的依赖,在其他数据库中不会打印出详细的依赖对象信息,那么在postgres库下去执行drop user的时候,会打印出具体的信息。

连接到postgres库执行如下:

postgres=# drop user test1;
ERROR:  role "test1" cannot be dropped because some objects depend on it
DETAIL:  privileges for table pg_class
privileges for schema grantor

这里就可以看到,有两个依赖项:

  • privileges for table pg_class:pg_class上test1用户的权限
  • schema grator上test1用户的权限

那么,我们就可以直接看一下这两个对象对应的权限,去除即可。

postgres=# select relname,relacl from pg_class where relname = 'pg_class';
 relname | relacl
----------+----------------------------------
 pg_class | {=r/superuser,test1=r/superuser}
(1 row)
postgres=# select nspname,nspacl from pg_namespace where nspname = 'grantor';
 nspname | nspacl
---------+---------------------------------------------------------
 grantor | {grantor=UC/grantor,grantor=LP/grantor,test1=U/grantor}
(1 row)
postgres=# revoke select on table pg_class from test1;
REVOKE
postgres=# revoke usage on schema grantor from test1;
REVOKE
postgres=# drop user test1;
DROP USER

此时再进行用户删除,就没有其他依赖了。

postgres=# drop user test1;
DROP USER

PS:如果不知道具体对象还删不掉的时候,我们怎么操作呢,此处构造一个案例作为演示,新建用户test2,并赋予其grantor的select权限,此时无法drop

testdb2=# drop user test2;
ERROR:  role "test2" cannot be dropped because some objects depend on it
DETAIL: 2 objects in database postgres

用户的依赖内部实际储存,为pg_shdepend系统表,里面记录了各个有依赖的对象的oid及其依赖关系。首先我们获取到用户的oid,再去系统表中找对应的依赖记录。

testdb2=# select oid ,rolname from pg_roles where rolname = 'test2';
 oid | rolname
------------+---------
 2147484573 | test2
(1 row)
postgres=# select * from pg_shdepend where refobjid = 2147484573;
 dbid | classid | objid | objsubid | refclassid | refobjid | deptype | objfile
-------+---------+------------+----------+------------+------------+---------+---------
 16073 | 2615 | 2147484575 | 0 | 1260 | 2147484573 | o       |
 16073 | 2615 | 2147484025 | 0 | 1260 | 2147484573 | a       |
(2 rows)
这里由于dependType不同,因此有两条记录,一个代表权限依赖(a),一个代表自身是一个对象的owner。

我们获取到classid之后,这个代表依赖当前用户的对象的记录表的id,那么我们去pg_class表中找到这个依赖即可:

postgres=# select relname,relacl from pg_class where oid = 2615;
 relname | relacl
--------------+----------------
 pg_namespace | {=r/d00467397}
(1 row)

OK,通过看到记录表是pg_namespace,那么就可以确认依赖用户的是一个schema。这里再到pg_namespace中,查上面获取到的objid,就知道了具体的对象

postgres=# select nspname,nspacl from pg_namespace where oid in (2147484575,2147484025);
 nspname | nspacl
---------+---------------------------------------------------------
 test2   |
 grantor | {grantor=UC/grantor,grantor=LP/grantor,test2=U/grantor}
(2 rows)

这里看到有两个schema,一个是用户同名的schema,一个是刚才赋权的grantor,赋权的处理掉之后,用户即可删除。

postgres=# revoke usage on schema grantor from test2;
REVOKE
postgres=# drop user test2;
DROP USER

 

点击关注,第一时间了解华为云新鲜技术~

与数据库中用户删除不掉总是报错,依赖如何处理干净?相似的内容:

数据库中用户删除不掉总是报错,依赖如何处理干净?

摘要:本文主要介绍如何进行用户的各种依赖识别与清理,并简单介绍下推荐的权限管理方式。 本文分享自华为云社区《GaussDB(DWS) 用户删除不掉时候总是报错,依赖如何处理干净?》,作者:Malick 。 数据库的使用中,有时会遇到某些用户离职,或者角色变更时,要对其账号进行销户,权限进行回收等操作

[转帖]并发delete导致oracle死锁问题的解决

项目中有一个批处理任务,用来删除数据库中过期的数据(包括说话人的语音、模型、记录等),当程序被分布式部署后,就会有多个批处理线程同时进行删除,不过不同的线程,会根据元信息表得到不同的说话人信息,从而删除不同的数据,并不存在竞争的问题,但是,当项目使用oracle数据库在线上运行时,却频繁出现了ORA

论如何直接用EF Core实现创建更新时间、用户审计,自动化乐观并发、软删除和树形查询(中)

前言 数据库并发,数据审计和软删除一直是数据持久化方面的经典问题。早些时候,这些工作需要手写复杂的SQL或者通过存储过程和触发器实现。手写复杂SQL对软件可维护性构成了相当大的挑战,随着SQL字数的变多,用到的嵌套和复杂语法增加,可读性和可维护性的难度是几何级暴涨。因此如何在实现功能的同时控制这些S

数据表删除DROP TRUNCATE DELETE区别

总的来说,DROP 用于删除整个数据库对象(表结构和数据全部删除),DELETE 用于删除表中的数据,而 TRUNCATE 也是删除表中的数据,但比 DELETE 更快,且无法指定条件删除。根据需求,选择适当的命令来删除数据或对象。 DROP: 1. DROP 用于删除数据库对象,例如表(table

驱动开发:内核注册表增删改查

注册表是Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息,注册表是一个巨大的树形结构,无论在应用层还是内核层操作注册表都有独立的API函数可以使用,而在内核中读写注册表则需要使用内核装用API函数,如下将依次介绍并封装一些案例,实现对注册表的创建,删除,更新,查询等操作。

【Azure 事件中心】Azure Event Hub中的数据能不能存储大于7天呢?如果7天之后是不是会自动删除呢?

问题描述 Event Hub中有个retention的设置为7天,有没有办法增大这个Retention的时间? 如果没办法,是不是超过7天的数据就会被删除? 问题解答 因为Azure Event Hub(事件中心)是一个实时事件流引擎,其设计意图并不是用于代替数据库以及/或者用作无限期保存的事件流的

8.1 C++ STL 变易拷贝算法

C++ STL中的变易算法(Modifying Algorithms)是指那些能够修改容器内容的算法,主要用于修改容器中的数据,例如插入、删除、替换等操作。这些算法同样定义在头文件 algorithm中,它们允许在容器之间进行元素的复制、拷贝、移动等操作,从而可以方便地对容器进行修改和重组。

数据分析缺失值处理(Missing Values)——删除法、填充法、插值法

缺失值指数据集中某些变量的值有缺少的情况,缺失值也被称为NA(not available)值。在pandas里使用浮点值NaN(Not a Number)表示浮点数和非浮点数中的缺失值,用NaT表示时间序列中的缺失值,此外python内置的None值也会被当作是缺失值。需要注意的是,有些缺失值也会以

数据结构(四):(顺序表)设计算法删除所有数字字符

好家伙,写作业 什么是顺序表: 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、 使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系, 采用顺序存

[转帖]Linux常用命令:利用sed命令删除文件的特定行

http://www.dbs724.com/12806.html 前言 正常来说,我们想要删除文件中的某些行内容,一般都是先打开这个文件,然后找到要删除的内容,再然后选中这些行并按删除键进行删除,这在数据量很少时是没有问题的。但是,一旦文件中的行数据非常多,而且数据冗杂的情况下,你还要用上面的方法去