天天看点

PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色_21.4. 删除角色

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;
-- 在集簇中的每一个数据库中重复上述命令
DROP ROLE doomed_role;      

如果不是所有的拥有对象都被转移给了同一个后继拥有者,最好手工处理异常 然后执行上述步骤直到结束。

如果在依赖对象还存在时尝试了

DROP ROLE

,它将发出 消息标识哪些对象需要被重新授予或者删除。

本文转自PostgreSQL中文社区,原文链接: