# 22.4.放弃角色
因为角色可以拥有数据库对象,并且可以拥有访问其他对象的权限,所以删除角色通常不仅仅是一个快速操作的问题放弃角色
。角色拥有的任何对象必须首先删除或重新分配给其他所有者;并且必须撤销授予该角色的任何权限。
对象的所有权可以使用改变
命令,例如:
ALTER TABLE bobs_table OWNER TO alice;
或者重新分配所有权
命令可用于将角色拥有的所有对象的所有权重新分配给其他单个角色。因为重新分配所有权
无法访问其他数据库中的对象,必须在包含角色拥有的对象的每个数据库中运行它。(请注意,第一个重新分配所有权
将更改要删除的角色所拥有的任何跨数据库对象(即数据库或表空间)共享的所有权。)
将任何有价值的对象转移给新所有者后,可以使用拥有
命令同样,此命令无法访问其他数据库中的对象,因此有必要在包含该角色拥有的对象的每个数据库中运行它。而且拥有
不会删除整个数据库或表空间,因此如果角色拥有尚未转移给新所有者的任何数据库或表空间,则必须手动删除。
拥有
还负责删除为不属于目标角色的对象授予的任何特权。因为重新分配所有权
如果不接触此类对象,通常需要同时运行重新分配所有权
和拥有
(按顺序!)完全删除要删除的角色的依赖项。
简而言之,删除用于拥有对象的角色的最常用方法是:
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;
当并非所有拥有的对象都要转移到同一个后续所有者时,最好手动处理异常,然后执行上述步骤来清理。
如果放弃角色
当从属对象仍保留时,它将发出消息,确定需要重新分配或删除哪些对象。