Правила внешних ключей
Для обеспечения ссылочной целостности или, как иногда говорят, для поддержки внешних ключей, у пользователя базы данных должна быть возможность определить набор операций по связи между Primary Key и Foreign Key, которые ему разрешены и которые ему запрещены. Прежде всего такая ситуация возникает, когда необходимо выполнить операцию Delete (что делать, если в главной таблице удаляется родительская запись).
В общем случае тут могут быть следующие операции:
1. Restrict – запретить удаление из главной, если есть подчиненные.
2. Cascade – каскадно удалить все подчиненные записи.
3. Set Null – установить значение внешних ключей подчиненных записей в нулевое значение (Null – значение).
4. Set Default – установить значение вешних ключей в предопределенное, начальное значение.
5. No Action – ничего не делать.
В Desktop по умолчанию No Action. Если рассматривать простую таблицу – родители и дети – «Если умирает родитель, это не означает, что детей тоже надо убивать… Запретить умирать тоже нельзя». Какое значение установить в подчиненных записях –«детях» — в каждом контексте решает сам пользователь(Set Null и т.д.). В данном случае операции Restrict и Cascade применять нельзя.
Вторая операция здесь – это Update.(что делать, если мы обновляем, меняем Primary Key в главной таблице). Возникает вопрос, что делать с Foreign Key в данном случае. В общем случае, все ранее названные операции для Delete здесь тоже могут быть. Все также зависит от контекста – e.g. при смене названия улицы, необходимо обновить названия в паспортах, табличках и т.д.. Но чаще всего применяют операцию Restrict – запретить обновление.
Каждая из операций так или иначе требует определенного кода, чтобы ее выполнить. К исключениям можно отнести лишь No Action. Во всех остальных случаях необходимо наличие кода. На практике это решается, условно говоря, одним способом, но двумя реализациями. Используется триггеры, являясь процедурой, она запускается на сервере баз данных, т.е. пользователь сам такой триггер явно запустить не может. Такого рода триггеры могут быть созданы на три операции – Insert (добавление), Delete,Update. Две реализации триггеров:
1. Триггер создается вручную, т.е. программист сам пишет код, при этом используя различные программные конструкции, учитывает все нюансы и т.д.
2. В простейшем случае, без учета всех тонкостей, СУБД сама может создать стандартный триггер, который реализует простое каскадное обновление или удаление и т.д. Как правило, он откомпилирован и посмотреть код такого триггера невозможно.