无法删除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-如何快速删除具有现有权限的用户
  • 如果用户有依赖对象,如何在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将(也(丢弃用户拥有的所有对象。(你确定吗?!(

相关:

  • 删除具有特权的角色(具有为所有相关DB生成命令的功能(
  • 查找链接到PostgreSQL角色的对象

对我有效的是遵循以下步骤:

  1. 连接到数据库
c mydatabase
  1. 重新分配所有权
REASSIGN OWNED BY ryan TO <newuser>;

或者/和只是删除对象

DROP OWNED BY ryan;
  1. 执行REVOKE PRIVILEGES
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM ryan;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM ryan;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM ryan;
  1. 删除用户
DROP USER ryan;

PS:您可能不需要同时执行第2步和第3步,通常只需执行两个步骤中的一个就足够了。

在RDS Postgres 13上对我有用的东西:

REVOKE ALL PRIVILEGES ON DATABASE <my_db> FROM <my_user>;

我也有一个类似的错误,角色是表的所有者,所以它不能被删除,必须用重新分配表所有者

ALTER TABLE <my_table> OWNER TO <trusted_role>;

在RDS上做这样的REASSIGN对我来说不起作用,因为AWS不会给你的主用户提供完全的超级用户:REASSIGN OWNED BY <olduser> TO <newuser>;

REVOKE ALL ON SCHEMA "public" FROM "<user>";

为我工作。

对我有效的是重新创建template1数据库,然后删除一些角色:

$ psql -U postgres postgres
postgres=# update pg_database set datistemplate = false where datname='template1';
UPDATE 1
postgres=# drop database template1;
DROP DATABASE
postgres=# create database template1 template=template0;
CREATE DATABASE
postgres=# update pg_database set datistemplate = true where datname='template1';
UPDATE 1
postgres=# DROP ROLE test;
DROP ROLE

对于使用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/

最新更新