Триггер с предложением instead of заменяет соответствующее действие, заданное для триггера. Он выполняется после создания соответствующих таблиц deleted и inserted, но до того, как будут выполнены ограничения целостности данных и любые другие действия.
Триггеры instead of могут быть созданы как для таблиц, так и для представлений. Когда оператор Transact-SQL ссылается на представление, у которого существует триггер instead of, система базы данных выполняет этот триггер, вместо выполнения любых других действий. Триггер всегда использует информацию таблиц deleted и inserted, созданных для представления, чтобы создавать любые операторы, необходимые для создания запрашиваемых событий.
Существуют некоторые требования к значениям столбцов, поставляемым триггерам instead of:
♦ значения не могут быть заданы для вычисляемых столбцов;
♦ значения не могут быть заданы для столбцов с типом данных timestamp;
♦ значения не могут быть заданы для столбцов со свойством identity, если опция identity_insert не установлена в on.
Эти требования применимы только к операторам insert и update, которые ссылаются на базовую таблицу. Оператор insert, ссылающийся на представление, которое имеет триггер instead of, должен поставлять все значения для столбцов этого представления, не допускающих пустые значения. (То же самое истинно и для оператора update: оператор update, который ссылается на представление, имеющее триггер instead of, должен поставлять значения для каждого столбца представления, который не допускает пустых значений и на который осуществляется ссылка в предложении set.)
В примере 14.5 показана разница в поведении в процессе добавления значений в вычисляемые столбцы при использовании таблицы и ее соответствующего представления.
В примере 14.5 используется таблица orders из главы 10, потому что эта таблица содержит два вычисляемых столбца (см. пример 10.8). Представление aiiorders выбирает все строки из этой таблицы. Это представление используется для задания значения столбца представления, который является вычисляемым столбцом базовой таблицы. Это способ применения триггера instead of, который в случае оператора insert заменяет пакет, добавляющий значения в базовую таблицу через представление aiiorders. (Оператор insert, который ссылается напрямую на базовую таблицу, не может поставлять значение вычисляемому столбцу.)