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

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

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

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

DROP TABLE products;

NOTICE:  constraint orders_product_no_fkey on table orders depends on table products
ERROR:  cannot drop table products because other objects depend on it
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

что означает

DROP TABLE products;

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

Данное сообщение об ошибке содержит полезный совет: если вы не хотите напрягаться, удаляя все зависящие объекты по-отдельности, вы можете запустить:

DROP TABLE products CASCADE;

и все зависящие от products объекты будут удалены. В данном случае, команда не удалит таблицу orders, она только удалит ограничение внешнего ключа. (Если вы хотите проверить, что будет делать DROP ... CASCADE, запустите DROP без CASCADE и прочтите в появившемся сообщении замечания NOTICE.)

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

Note: В соответствии со стандартом SQL, требуется либо указание RESTRICT либо CASCADE. В настоящее время нет СУБД принуждающих соблюдать это правило, вместо этого в зависимости от СУБД устанавливается поведение по умолчанию RESTRICT или CASCADE.

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

Back to top

(С) Виктор Вислобоков, 2008-2023