由于角色可能拥有数据库对象并能够持有访问其他对象的权限,因此不删除角色通常不仅仅是一个 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 OWNED
和 DROP 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
,则它会发出消息来标识需要重新分配或删除的对象。