21.4. 放弃角色

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

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

ALTER TABLE bobs_table OWNER TO alice;

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

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

DROP OWNED还负责删除授予不属于目标角色的对象的任何特权。由于REASSIGN OWNED不会触摸此类对象,因此通常必须同时运行REASSIGN OWNEDDROP OWNED(以该 Sequences!)以完全删除要删除的角色的依赖关系。

简而言之,删除用于拥有对象的角色的最一般方法是:

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,它将发出消息,指出需要重新分配或删除哪些对象。