Вы можете создать триггеры при использовании оператора Transact-SQL CREATE TRIGGER. Оператор CREATE TRIGGER имеет следующий синтаксис.
CREATE TRIGGER [ schema_name . ]trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME <method specifier [ ; ] > }
Существует две категории триггеров DML:
Триггеры AFTER. Триггеры AFTER выполняются после действия операторов INSERT, UPDATE или DELETE. Определение триггера AFTER имеет то же самое определение, что и триггер FOR, который являлся единственным доступным типом в более ранних версиях Microsoft SQL Server. Вы можете определять триггеры AFTER только для таблиц.
Триггеры INSTEAD OF. Триггеры INSTEAD OF выполняются вместо обычных триггерных действий (вставка, обновление, удаление). Триггеры INSTEAD OF также могут быть определены на представлениях с одной или более базисными таблицами, чтобы расширить действия операторов обновления, поддерживаемые представлениями.
Главное преимущество триггеров заключается в том, что они могут содержать сложную логику обработки с использованием кода Transact-SQL. Поэтому, триггеры поддерживают больший набор функциональных возможностей по сравнению с ограничениями. Однако, целостность данных должна всегда реализовываться на самом низком уровне – уровне ограничений, до тех пор пока они отвечают требованиям приложения.
Триггеры являются наиболее полезными, когда возможности, поддерживаемые ограничениями, не могут отвечать функциональные потребностям приложения. Например:
■ Ограничение FOREIGN KEY может проверять значение столбца только на точное соответствие значению другого столбца, если в разделе REFERENCES не определено каскадирование некоторого действия по ссылкам.
■ Ограничения могут сообщать об ошибках только через стандартную систему сообщений об ошибках. Если Ваше приложение требует более сложной обработки ошибок, Вы должны использовать триггер.
Триггеры могут каскадировать изменения через связанные таблицы в базе данных; однако, эти изменения могут быть выполнены более эффективно через ограничения:
■ Триггеры могут откатить изменения, которые нарушают ссылочную целостность, таким образом, отменяя предпринятую модификацию данных. Такой триггер мог бы срабатывать, когда Вы изменяете внешний ключ, и его новое значение не соответствует первичному ключу. Однако для этой цели обычно используются ограничения FOREIGN KEY.
■, Если на таблице с триггерами существуют ограничения, то они проверяются после триггера INSTEAD OF, но до триггера AFTER. Если ограничения нарушены, то действия триггера INSTEAD OF откатываются, а триггер AFTER не выполняется.