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