由于角色可以拥有数据库对象,并且可以拥有访问其他对象的权限,因此删除角色通常不仅仅是快速执行 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
,它将发出消息,标识需要重新分配或删除哪些对象。
如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。