支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

21.4. 删除角色 #

由于角色可以拥有数据库对象,并且可以拥有访问其他对象的权限,因此删除角色通常不仅仅是快速执行 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 OWNEDDROP 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,它将发出消息,标识需要重新分配或删除哪些对象。

提交更正

如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。