5.12. Отслеживание зависимостей

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

Чтобы обеспечить целостность всей структуры базы данных, PostgreSQL не позволяет удалять объекты, от которых зависят другие. Например, попытка удалить таблицу products (мы рассматривали её в Подразделе 5.3.5), от которой зависит таблица orders, приведёт к ошибке примерно такого содержания:

DROP TABLE products;

ЗАМЕЧАНИЕ:  ограничение orders_product_no_fkey зависит от объекта
  "таблица products"
ОШИБКА:  удалить объект "таблица products" нельзя, так как от него зависят другие
  объекты
ПОДСКАЗКА:  Для удаления зависимых объектов используйте DROP ... CASCADE.

Сообщение об ошибке включает полезную подсказку: если вы не хотите заниматься ликвидацией зависимостей по отдельности, вы можете выполнить:

DROP TABLE products CASCADE;

и все зависимые объекты будут удалены. В этом случае таблица orders останется, а будет удалено только её ограничение внешнего ключа. (Если вы хотите проверить, что произойдёт при выполнении DROP ... CASCADE, запустите DROP без CASCADE и прочитайте ЗАМЕЧАНИЕ (NOTICE).)

Все команды DROP в PostgreSQL поддерживают указание CASCADE. Конечно, вид возможных зависимостей зависит от типа объекта. Вы также можете написать RESTRICT вместо CASCADE, чтобы включить поведение по умолчанию, когда объект можно удалить, только если от него не зависят никакие другие.

Замечание: Стандарт SQL требует явного указания RESTRICT или CASCADE. Но это требование на самом деле не выполняется ни в одной СУБД, при этом одни системы по умолчанию подразумевают RESTRICT, а другие — CASCADE.

Замечание: Зависимости внешнего ключа и колонки последовательности, созданные в версиях PostgreSQL до 7.3 не поддерживаются и не воссоздаются в процессе обновления. Все другие типы зависимостей будут созданы должным образом при обновлении таких старых версий.