Сравнение триггеров и ограничений
Ограничения и триггеры DML имеют свои преимущества и используются в различных ситуациях. Основным достоинством триггеров DML является то, что в них могут содержаться сложные логические выражения, в которых используется код Transact-SQL. При этом триггеры DML поддерживают все функции ограничений. Однако триггеры DML могут применяться не во всех случаях.
Целостность сущностей всегда должна поддерживаться на самом низком уровне с помощью индексов, являющихся частью ограничений PRIMARY KEY и UNIQUE, либо созданных независимо от них. Целостность домена должна поддерживаться с помощью ограничений CHECK, а ссылочная целостность (RI) должна поддерживаться ограничениями FOREIGN KEY, при этом их параметры должны соответствовать функциональным потребностям приложения.
Триггеры DML наиболее полезны в тех случаях, когда функции ограничений не удовлетворяют функциональным потребностям приложения. Например.
Ограничения FOREIGN KEY могут проверить значения столбца только на предмет точного совпадения со значениями другого столбца, за исключением случаев, когда с помощью предложения REFERENCES задаются каскадные ссылочные действия.
Ограничения могут сообщать об ошибках только с помощью соответствующих стандартных системных сообщений. Если для пользовательского приложения требуются более сложные методы управления ошибками и, соответственно, пользовательские сообщения, то необходимо использовать триггер.
Для внесения каскадных изменений в связанные таблицы базы данных можно использовать триггеры DML, однако удобнее делать это с помощью каскадных ограничений ссылочной целостности.
При использовании триггеров DML может произойти откат изменений, нарушающих ссылочную целостность, что приводит к запрету модификации данных. Подобные триггеры могут применяться при изменении внешнего ключа в случаях, когда новое значение не соответствует первичному ключу. Обычно в указанных случаях используются ограничения FOREIGN KEY.
Если в таблице триггеров существуют ограничения, то их проверка осуществляется между выполнением триггеров INSTEAD OF и AFTER. В случае нарушения ограничений выполняется откат действий триггеров INSTEAD OF, а триггер AFTER не срабатывает.
См. также