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

not*_*eek 11 postgresql roles database-administration

我试图删除PostgreSQL用户:

DROP USER ryan;
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

Error in query:
ERROR: role "ryan" cannot be dropped because some objects depend on it
DETAIL: privileges for database mydatabase
Run Code Online (Sandbox Code Playgroud)

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

还是有同样的错误.

在我向用户"ryan"授予所有权限后,会发生这种情况:

GRANT ALL PRIVILEGES ON DATABASE mydatabase ON SCHEMA public TO ryan;
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 21

摆脱所有特权(从措辞中不太明显).手册:DROP OWNED

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

因此,删除角色的可靠命令序列是:

REASSIGN OWNED BY ryan TO postgres;  -- or some other trusted role
DROP OWNED BY ryan;
-- repeat in ALL databases where the role owns anything or has any privileges!

DROP USER ryan;
Run Code Online (Sandbox Code Playgroud)

有关:

  • 重新分配 OWNED 或删除它们对我来说都不起作用。从超级用户运行时仍然遇到相同的错误。 (4认同)

Sam*_*ele 15

对我有用的是 1) 连接到数据库

\c mydatabase
Run Code Online (Sandbox Code Playgroud)

2) 重新分配所有权

REASSIGN OWNED BY ryan TO <newuser>;
Run Code Online (Sandbox Code Playgroud)

或/和只是删除对象

DROP OWNED BY ryan;
Run Code Online (Sandbox Code Playgroud)

3) 执行 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;
Run Code Online (Sandbox Code Playgroud)

4)删除用户

DROP USER ryan;
Run Code Online (Sandbox Code Playgroud)

PS:您可能不需要同时执行第 2 步和第 3 步,通常只需执行这两个步骤之一即可。

  • 使用“REVOKE CONNECT ON DATABASE db_name FROM role_name;”和“REVOKE ALL ON SCHEMA public FROM role_name;”分别撤销连接和使用权限。[来源](/sf/answers/2019475951/) (2认同)

And*_*rew 11

在 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>;


Erc*_*dre 9

REVOKE ALL ON SCHEMA "public" FROM "<user>";
Run Code Online (Sandbox Code Playgroud)

为我工作。