首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误:不能删除角色"user1“,因为某些对象依赖它

错误:不能删除角色"user1“,因为某些对象依赖它
EN

Database Administration用户
提问于 2020-12-04 07:26:34
回答 1查看 5K关注 0票数 6

在我的数据库实例(Postgres 9.6)上,我无法通过通过GCP控制台创建的GCP控制台删除用户/角色。当我尝试时,控制台显示一个通知,上面写着“用户删除”,然后在进一步检查后,我发现操作失败了,出现了“未知错误”。实例的错误日志显示以下错误:

代码语言:javascript
运行
复制
06:42:36.347 UTC [199]: [1-1] db=cloudsqladmin,user=cloudsqlagent ERROR:  role "user1" cannot be dropped because some objects depend on it
06:42:36.347 UTC [199]: [2-1] db=cloudsqladmin,user=cloudsqlagent DETAIL:  privileges for database mydb
24 objects in database mydb

我可以通过运行

代码语言:javascript
运行
复制
SELECT distinct table_name
FROM information_schema.role_table_grants
WHERE grantee = 'user1'

按照https://cloud.google.com/sql/docs/postgres/create-manage-users#deleting_用户的建议,我知道在删除用户之前,我必须将所有权重新分配给另一个角色(postgres),但是当我尝试运行以下脚本时(从https://stackoverflow.com/questions/51256454/cannot-drop-postgresql-role-error-cannot-be-dropped-because-some-objects-depe):

代码语言:javascript
运行
复制
REASSIGN OWNED BY user1 TO postgres;
DROP OWNED BY user1;
DROP USER user1;

由于Cloud没有给我的用户REASSIGN状态(https://cloud.google.com/sql/docs/postgres/users#superuser_限制)提供权限,所以在ERROR: permission denied to reassign objects命令上出现了一个权限错误。我也不确定如何将SUPERUSER状态授予Cloud数据库实例中的用户;我的假设是我不能。

在使用Cloud的gcloud命令时也会出现此问题。产出类似:

代码语言:javascript
运行
复制
$ gcloud sql users delete user1 --instance=
user1@None will be deleted. New connections can no longer be made
using this user. Existing connections are not affected.

Do you want to continue (Y/n)? Y

Deleting Cloud SQL user...failed.
ERROR: (gcloud.sql.users.delete) [INTERNAL_ERROR]

重要信息:

  • Postgres版本 9.6
  • 读取副本附加到此实例。
  • 是的,我试过一次又一次地关掉它。不,重新启动主实例和读取副本都不能解决这个问题。
  • 此实例上的所有数据库模式迁移和数据迁移都是使用具有非常标准配置的Flask-Alembic完成的。
  • 我可以验证,在我们的云构建配置中,没有任何用户在Alembic流程之外更改过模式
  • 用户是在GCP控制台中创建的。
  • 未对用户、特权或对象所有权进行手动更改。
EN

回答 1

Database Administration用户

发布于 2020-12-05 14:08:56

06:42:36.347 UTC : db=cloudsqladmin,user=cloudsqlagent DETAIL:数据库中数据库mydb 24对象的权限mydb

PostgreSQL中的跨数据库查询没有实现。PostgreSQL将看到指定pg_catalog.pg_shdepend.dbid的一些依赖项,但无法查询该数据库的系统目录以确定它们是哪些对象。因此,postgresql只在其他数据库的错误详细信息中提示数据库名称。(这也是为什么PostgreSQL没有drop user ... cascade的原因--我们不能修改甚至不能从另一个数据库读取对象描述)

但是,如果连接到详细信息中指定的数据库并尝试删除用户,您将得到更详细的描述:

代码语言:javascript
运行
复制
postgres=# drop user user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  3 objects in database m2
postgres=# \connect m2 
You are now connected to database "m2" as user "postgres".
m2=# drop user user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  privileges for table foo
privileges for table foofk
owner of table test

在这种情况下,user1是一个表的所有者(REASSIGN OWNED可以很容易地解决这个问题),另外两个表上的一些概要(REASSIGN OWNED不会碰这个)。

对于不同的对象需要某些命令(revoke用于权限,alter default privileges用于默认权限等等),不幸的是,即使在一个数据库中,也没有万能的环来管理所有依赖关系。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/280878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档