Postgresql 中文操作指南

22.4. Dropping Roles #

由于角色可以拥有数据库对象并可以持有访问其他对象的权限,因此删除角色通常不仅仅是 DROP ROLE 的问题。角色拥有的任何对象都必须首先删除或重新分配给其他所有者;并且授予该角色的所有权限都必须被撤销。

可以使用 ALTER 命令一次一个地转移对象的所有权,例如:

ALTER TABLE bobs_table OWNER TO alice;

另外, REASSIGN OWNED 命令可用于将要删除的角色所拥有所有对象的所有权重新分配给单一角色。因为 REASSIGN OWNED 无法访问其他数据库中的对象,因此必须在包含该角色所拥有对象的每个数据库中运行它。(注意,第一个此类 REASSIGN OWNED 将更改由要删除的角色所拥有的任何跨数据库共享的对象即数据库或表空间的所有权。)

一旦所有有价值的对象转移给新所有者,就可以使用 DROP OWNED 命令删除要删除的角色所拥有剩下的任何对象。同样,此命令无法访问其他数据库中的对象,因此必须在包含该角色所拥有对象的每个数据库中运行它。另外, DROP OWNED 不会删除整个数据库或表空间,因此,如果角色拥有尚未转移给新所有者的任何数据库或表空间,则必须手动进行操作。

DROP OWNED 还负责移除目标角色对不属于该角色的对象所授予的任何权限。由于 REASSIGN OWNED 不会触碰此类对象,因此通常必须分别运行 REASSIGN OWNEDDROP OWNED(按此顺序!),以彻底地移除将要删除的角色的依赖关系。

总之,移除用来拥有对象的某个角色的最通用的做法是:

REASSIGN OWNED BY doomed_role TO successor_role;
DROP OWNED BY doomed_role;
-- repeat the above commands in each database of the cluster
DROP ROLE doomed_role;

如果所有受拥有对象并非要传输给同一位继任所有者,则最好是手动处理异常,然后再执行上述步骤进行清理。

如果在仍然存在依赖对象时尝试 DROP ROLE,它将发出消息,标识需要重新分配或删除哪些对象。