Действия триггеров по изменению правил целостности
Действия триггеров по изменению правил целостности
Очевидно, что правила целостности применяются, когда происходят изменения данных, влияющих на отношение. При этом правила по умолчанию не всегда подходят для всех требований. Мы можем захотеть перекрыть правило, которое позволяет создавать зависшие дочерние строки или сделать их зависшими при установке значения их внешнего ключа в NULL. Если для наших бизнес-правил требуется запрет удаления родительской строки, имеющей дочерние строки, мы можем пожелать, чтобы Firebird позаботился об этой проблеме автоматически. Язык SQL в Firebird позволяет сделать это с помощью необязательных автоматических действий триггеров:
[ON DELETE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}]
[ON UPDATE {NO ACTION | CASCADE | SET NULL | SET DEFAULT}]
Автоматические действия триггеров
Firebird предоставляет необязательные стандартные события DML - ON UPDATE и ON DELETE, - используемые для изменения правил ссылочной целостности. События DML и автоматическое поведение совместно определяют действия для триггера - какие действия должны быть выполнены для зависимой таблицы при изменении или удалении соответствующего ключа в родительской таблице. Определение действий включают каскадные изменения в связанной через внешний ключ таблице (таблицах).
Семантика действий триггера
NO ACTION
Поскольку это действие триггера по умолчанию, ключевое слово может быть - и часто бывает - опущено[49]. Операция DML над родительским первичным ключом не изменяет внешний ключ и потенциально может привести к ошибке операции над родительской таблицей.
ON UPDATE CASCADE
В зависимой таблице внешний ключ, соответствующий старому значению первичного ключа, изменяется на новое значение первичного ключа.
ON DELETE CASCADE
В зависимой таблице удаляются строки с соответствующим значением ключа.
SET NULL
Внешний ключ, соответствующий старому значению родительского первичного ключа, устанавливается в NULL- зависимые строки становятся зависшими. Ясно, что это действие триггера не может быть применено, если столбец внешнего ключа не допускает пустых значений.
SET DEFAULT
Внешний ключ, соответствующий старому значению первичного ключа, устанавливается в его значение по умолчанию. Существует несколько понятий относительно этого действия, о которых важно знать.
* Используется значение по умолчанию, которое существовало в момент создания ограничения FOREIGN KEY. Если значение по умолчанию у столбца будет изменено позже, то значение по умолчанию для действия SET DEFAULT В определении внешнего ключа не будет изменено на новое значение - оно сохранит прежнее значение.
* Если никакое значение по умолчанию не было явно установлено для столбца, то неявным значением по умолчанию будет NULL. В этом случае поведение при SET DEFAULT будет тем же самым, что и при SET NULL.
* Если значение по умолчанию для столбца внешнего ключа - такое значение, которое не имеет соответствующего значения первичного ключа в родительской таблице, то действие триггера приведет к нарушению ограничения.