如果用户有依赖对象,如何在 postgres 中删除用户

Posted

技术标签:

【中文标题】如果用户有依赖对象,如何在 postgres 中删除用户【英文标题】:How to drop user in postgres if it has depending objects 【发布时间】:2016-01-04 11:26:28 【问题描述】:

数据库 idd 所有者是角色 idd_owner

数据库有 2 个数据模式:publicfirma1。 用户可能在此数据库和对象中具有直接或间接分配的权限。 用户不是任何对象的所有者。它只授予权限。

如何删除这样的用户?

我试过了

revoke all on all tables in schema public,firma1 from "vantaa" cascade;
revoke all on all sequences in schema public,firma1 from "vantaa" cascade;
revoke all on database idd from "vantaa" cascade;
revoke all on all functions in schema public,firma1 from "vantaa" cascade;
revoke all on schema public,firma1 from "vantaa" cascade;
revoke idd_owner from "vantaa" cascade;
ALTER DEFAULT PRIVILEGES IN SCHEMA public,firma1 revoke all ON TABLES from "vantaa";
DROP ROLE if exists "vantaa"

但出现错误

role "vantaa" cannot be dropped because some objects depend on it
DETAIL:  privileges for schema public
DROP ROLE if exists "vantaa"

如何解决这个问题,以便用户可以删除?

如何创建以用户名为参数的 sql 或 plpgsql 方法,并在所有情况下删除该用户而不删除数据?

使用 Postgres 9.1+

【问题讨论】:

这能回答你的问题吗? PostgreSQL - how to quickly drop a user with existing privileges 【参考方案1】:

在删除用户之前,您可以运行:

REASSIGN OWNED BY vantaa TO <newuser>

如果您不知道将其重新分配给谁,您可以重新分配给 postgres ...

REASSIGN OWNED BY vantaa TO postgres;

【讨论】:

我试过但得到错误permission denied to reassign objects。运行此命令的用户不是超级用户。如果有帮助,我可以为调用此命令的用户添加一些权限。如何解决? 我也试过reassign owned by vantaa to idd_owner,但得到了同样的错误。 我在用户 postgres 下运行了 reassign 命令。之后 drop 用户仍然会导致相同的错误。【参考方案2】:

您的重新分配可能会失败。 当您重新分配给新用户/角色时 - 你在当前选择的数据库上做 - 当前用户必须属于'from'角色和'to'(授予他们并在之后撤销他们)

我的一个shell脚本的摘录(省略了一些东西)

# The DROP USER operation will fail if this user is the owner of an existing schema, table, index...
# The user creating a resource owns it. It should transfer the ownership to the role
# When reassigning, the current user needs to have the <<roles>> associated to BY and TO to execute the command.
GRANT $_roleservice TO $_superuser;                       
GRANT $_account TO $_superuser;                                                                
REASSIGN OWNED BY $_account TO $_roleservice;            
# dropping the user removes it from the current user list of roles/users
DROP USER $_account;  
REVOKE $_roleservice FROM $_superuser;  

【讨论】:

以上是关于如果用户有依赖对象,如何在 postgres 中删除用户的主要内容,如果未能解决你的问题,请参考以下文章

postgres如何进行条件连接

如何在 Redshift 或 Postgres 的视图中获取列依赖关系?

如果 Postgres 中存在,则删除 USER(具有特权)

如何在 Postgres 的窗口函数中获取 mode()?

在 NodeJS 中,如何使用 node-postgres 模块将 JSON 对象保存为文本?

如何从 Postgres 数据库中删除用户 [重复]