我试图删除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角色的对象
对我有效的是遵循以下步骤:
- 连接到数据库
c mydatabase
- 重新分配所有权
REASSIGN OWNED BY ryan TO <newuser>;
或者/和只是删除对象
DROP OWNED BY ryan;
- 执行
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;
- 删除用户
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的人,您可以尝试以下
- 登录postgres用户,然后授予所有者
postgres=> GRANT target_user to old_user;
GRANT ROLE
- 使用要删除的用户(old_user(登录到目标数据库,然后重新分配
target_db=> REASSIGN OWNED BY old_user TO target_user;
REASSIGN OWNED
- 重新登录到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/