2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 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 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,它会发出消息,指明哪些对象需要重新分配或删除。

提交更正

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