Cannot drop PostgreSQL role. Error: `cannot be dropped because some objects depend on it`

Cannot drop PostgreSQL role. Error: `cannot be dropped because some objects depend on it`

我正在尝试删除 PostgreSQL 用户:

DROP USER ryan;

我收到这个错误:

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

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

还是一样的错误。

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

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

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

DROP OWNED取消所有权限(从字面上看不太明显)The manual:

[...] Any privileges granted to the given roles on objects in the current database and on shared objects (databases, tablespaces) will also be revoked.

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

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

相关:

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

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

Or/and 刚刚删除对象

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 步,通常只需执行这两个步骤中的一个即可。

对我有用的是重新创建 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

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

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

我也有一个类似的错误,角色是 tables 的所有者,所以它不能被删除,不得不重新分配 table 所有者:

ALTER TABLE <my_table> OWNER TO <trusted_role>;

在 RDS 上进行这样的重新分配对我不起作用,因为 AWS 不会为您的主用户提供完整的超级用户权限: REASSIGN OWNED BY <olduser> TO <newuser>;