2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 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,它将发出消息,识别哪些对象需要重新分配或删除。

提交更正

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