我需要放弃这个角色。
在角色可能拥有任何东西或具有任何授予的特权的同一集群的每个数据库中运行此命令:
REASSIGN OWNED BY some_role_name TO postgres;DROp OWNED BY some_role_name;
postgres作为默认的超级用户,您可以选择其他任何用户。它要拥有当前由旧角色拥有的对象。在紧接之后
REASSIGNOWNED,没有剩余的对象将由同一用户 拥有 。跑步似乎是不合常理的
DROPOWNED。该命令的措辞是误导,因为它 也
撤销了在同一个数据库中的角色的所有特权和缺省权限。手册:
DROP OWNED删除当前数据库中由指定角色之一拥有的所有对象。
在当前数据库中的对象和共享对象(数据库,表空间)上授予给定角色的任何特权也将被撤销。
大胆强调我的。
您仍然必须在角色拥有任何东西或具有任何授予的特权的 _ 每个数据库_ 中执行它。手册:
因为
REASSIGN OWNED它不影响其他数据库中的对象,所以通常需要在每个数据库中执行此命令,该数据库包含要删除的角色所拥有的对象。
最后,运行(一次):
DROP role some_role_name;
角色存储在群集范围的系统目录中,而对象的所有权和特权存储在数据库本地系统目录中。
此相关答案中的详细说明:
- 查找链接到PostgreSQL角色的对象
手册中有一个相关页面,其中包含说明。
全自动化
没有单个命令可以完成所有操作。但是您可以让Postgres为您生成一个完整的psql脚本。
角色的依赖关系存储在系统目录中
pg_shdepend:
该信息使PostgreSQL可以确保在尝试删除这些对象之前未对其进行引用。
由于我们(潜在地)需要连接到不同的数据库,因此我们需要结合使用psql元命令(
c my_database)和SQL
DDL命令,如上所示。一次在数据库集群中的某个位置创建此函数:
CREATE OR REPLACE FUNCTION f_generate_ddl_to_remove_role(dead_role_walking regrole) RETURNS text LANGUAGE sql AS$func$SELECT concat_ws( E'n' ,(SELECT string_agg(format(E'\c %InREASSIGN OWNED BY %2$s TO postgres; DROP OWNED BY %2$s;' , d.datname, dead_role_walking) , E'n') FROM ( SELECt DISTINCT dbid FROM pg_shdepend WHERe refobjid = dead_role_walking ) s JOIN pg_database d ON d.oid = s.dbid) , format(E'DROP role %s;n', dead_role_walking) )$func$;
称呼:
SELECT f_generate_ddl_to_remove_role('some_role_name');产生一个像这样的字符串:
c my_db1REASSIGN OWNED BY some_role_name TO postgres; DROP OWNED BY some_role_name;c my_db2REASSIGN OWNED BY some_role_name TO postgres; DROP OWNED BY some_role_name;DROP role some_role_name;
或者,如果角色不拥有任何东西并且没有特权,则只需:
DROP role some_role_name;
如果提供的角色名称不存在,则会出现错误。
将字符串(不包含单引号)复制到使用超级用户(如)打开的psql会话中
postgres。或将bash脚本与其连接。全部完成。
有几个相关的答案,其中有更多关于动态SQL的解释:
- https://stackoverflow.com/search?q=%5Bplpgsql%5D+%5Bdynamic-sql%5D+string_agg



