21.4. Удаление ролей#

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;
-- repeat the above commands in each database of the cluster
DROP ROLE doomed_role;

Когда не все объекты, принадлежащие владельцу, должны быть переданы одному и тому же преемнику, лучше всего обрабатывать исключения вручную, а затем выполнять вышеуказанные шаги для уборки.

Если выполняется команда DROP ROLE, когда все еще существуют зависимые объекты, будет выдано сообщение, идентифицирующее объекты, которые необходимо переназначить или удалить.