Redrock Postgres 搜索 英文
版本: 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

22.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,它将发出消息,指出需要重新分配或删除哪些对象。