Сравнение триггеров и ограничений

Ограничения и триггеры 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 не срабатывает.