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

时间:2018-07-10 02:28:25

标签: postgresql roles database-administration

我正试图删除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;

5 个答案:

答案 0 :(得分:10)

使用 DROP OWNED (在措辞上不太明显)摆脱所有特权。 The manual:

  

[...]当前对象中授予给定角色的任何特权   数据库和共享对象(数据库,表空间)上的内容也会被撤消。

因此,放弃角色的可靠命令顺序为:

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;

相关:

答案 1 :(得分:0)

授予ryan所有权限都无济于事,很可能他是数据库所有者。您需要让别人拥有它:

REASSIGN OWNED BY ryan TO postgres;

除非您不再需要mydatabase,否则可以删除数据库(确保在执行此操作之前确实不需要它):

DROP DATABASE mydatabase;

答案 2 :(得分:0)

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

\c mydatabase

2)重新分配所有权

REASSIGN OWNED BY ryan TO <newuser>;

或/并且仅删除对象

DROP OWNED BY ryan;

3)执行撤销特权

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;

4)删除用户

DROP USER ryan;

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

答案 3 :(得分:0)

我在多租户数据库环境中遇到此错误,因为我试图删除并重新加载数据库A和角色X,但是同一服务器上的另一个数据库B也正在使用角色X。

从角色重新分配所有内容的最佳解决方案在这种情况下似乎不起作用。我找到的最简单的解决方案是使用以下命令标识先前存在的数据库:

psql -U postgres postgres
\list

然后删除数据库:

DROP DATABASE A;
DROP DATABASE B;

在那之后,我可以放弃我的角色:

DROP ROLE X;

答案 4 :(得分:-1)

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