无法删除 PostgreSQL 角色。错误:\`无法删除,因为某些对象依赖于它\`

新手上路,请多包涵

我试图删除 PostgreSQL 用户:

 DROP USER ryan;

我收到了这个错误:

>  Error in query:
> ERROR: role "ryan" cannot be dropped because some objects depend on it
> DETAIL: privileges for database mydatabase
>
> ```

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

- [PostgreSQL - 如何快速删除具有现有权限的用户](https://stackoverflow.com/questions/3023583/postgresql-how-to-quickly-drop-a-user-with-existing-privileges)
- [如果用户有依赖对象,如何在 postgres 中删除用户](https://stackoverflow.com/questions/32988702/how-to-drop-user-in-postgres-if-it-has-depending-objects)

仍然有同样的错误。

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

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

”`

原文由 notalentgeek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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 将(也)删除用户拥有的所有对象。 (你确定吗?!)

有关的:

原文由 Erwin Brandstetter 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于使用 AWS Postgresql RDS 的人,您可以尝试关注

  1. 登录到 postgres 用户,然后授予所有者
postgres=> GRANT target_user to old_user;
GRANT ROLE

  1. 使用想要删除的用户(old_user)登录到目标数据库,然后重新分配
target_db=> REASSIGN OWNED BY old_user TO target_user;
REASSIGN OWNED

  1. 重新登录到 postgres 用户,撤销所有权限然后删除用户
postgres=> REVOKE ALL PRIVILEGES ON DATABASE target_db FROM old_user;
REVOKE
postgres=> DROP USER old_user;
DROP ROLE

参考。 https://aws.amazon.com/premiumsupport/knowledge-center/rds-postgresql-drop-user-role/

原文由 Jay Sithiporn 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进