问题:无法删除 PostgreSQL 角色。错误:cannot be dropped because some objects depend on it

我试图删除 PostgreSQL 用户:

DROP USER ryan;

我收到了这个错误:

查询错误:

错误:无法删除角色“ryan”,因为某些对象依赖于它

详细信息:数据库 mydatabase 的权限

我从这些线程中寻找解决方案:

  • PostgreSQL - 如何快速删除具有现有权限的用户

  • 如果用户有依赖对象,如何在 postgres 中删除用户

仍然有同样的错误。

这发生在我向用户“ryan”授予所有权限后:

GRANT ALL PRIVILEGES ON DATABASE mydatabase ON SCHEMA public TO ryan;

解答

DROP USER(或DROP ROLE,同样的事情)无法继续,而角色仍然拥有任何东西或对其他对象具有任何授予的权限。

使用 DROP OWNED (从措辞上看不太明显) 摆脱所有特权。说明书:

[...] 授予给定角色对当前数据库中的对象和共享对象(数据库、表空间)的任何特权也将被撤销。

所以删除角色的可靠命令序列是:

REASSIGN OWNED BY ryan TO postgres;  -- or some other trusted role
DROP OWNED BY ryan;

同一个集群的每个数据库中运行这两个命令,其中角色拥有任何东西或具有任何特权!

最后:

DROP USER ryan;
  • REASSIGN OWNED更改角色当前拥有的所有对象的所有权。

  • DROP OWNED然后只撤销特权(所有权不受影响)。

或者,您可以跳过REASSIGN OWNED。然后DROP OWNED将(也)删除用户拥有的所有对象。 (你确定吗?!)

有关的:

  • 删除具有特权的角色(具有为所有相关数据库生成命令的功能)

  • 查找链接到 PostgreSQL 角色的对象

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐