Skip to content

22.4. 删除角色#

由于角色可以拥有数据库对象,并且可以持有访问其他对象的权限,因此删除角色通常不仅仅是快速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,它将发出消息,指出需要重新分配或删除哪些对象。