Триггеры INSTEAD OF UPDATE
Триггеры INSTEAD OF UPDATE могут быть определены для представления или таблицы, чтобы заменить стандартное действие инструкции UPDATE. Как правило, триггер INSTEAD OF UPDATE определяется для представления с целью изменения данных в одной или нескольких базовых таблицах.
Инструкции UPDATE, которые ссылаются на представления с триггерами INSTEAD OF UPDATE, должны предоставить значения для всех обязательно определяемых столбцов представления, на которые ссылается предложение SET. Сюда входят столбцы представления, содержащие ссылки на столбцы базовой таблицы, для которых входные значения не могут быть указаны, например:
вычисляемые столбцы базовой таблицы;
столбцы идентификаторов в базовой таблице, для которых IDENTITY INSERT устанавливается в состояние OFF;
столбцы базовой таблицы с типом данных timestamp.
Нередко в случаях, когда инструкция UPDATE, ссылающаяся на таблицу, пытается установить значение для вычисляемого столбца, столбца идентификаторов или столбца с типом данных timestamp, возникает ошибка, так как значения этих столбцов определяются SQL Server. Эти столбцы должны быть включены в инструкцию UPDATE, чтобы соответствовать требованию NOT NULL для столбца. Но если инструкция UPDATE ссылается на представление с триггером INSTEAD OF UPDATE, то логика, определенная в триггере, может пропустить эти столбцы и избежать ошибки. Для этого триггер INSTEAD OF UPDATE не должен пытаться обновить значения соответствующих столбцов в базовой таблице. В этих целях не следует включать эти столбцы в предложение SET инструкции UPDATE. В процессе обработки записи из таблицы inserted вычисляемый столбец, столбец идентификаторов или столбец с типом данных timestamp может содержать фиктивное значение, чтобы удовлетворить требованию NOT NULL для столбца, но триггер INSTEAD OF UPDATE пропускает эти значения, и с помощью SQL Server устанавливаются правильные значения.
Это решение работает, так как триггеру INSTEAD OF UPDATE не нужно обрабатывать данные из столбцов inserted, которые не обновляются. В таблице inserted, переданной триггеру INSTEAD OF UPDATE, для столбцов, указанных в предложении SET, действуют те же правила, что и для столбцов inserted в триггере INSTEAD OF INSERT. Для столбцов, не указанных в предложении SET, таблица inserted содержит значения в том виде, в котором они существовали до выполнения инструкции UPDATE. Триггер может протестировать с помощью предложения IF UPDATE(column), был ли определенный столбец обновлен. Дополнительные сведения см. в разделе Триггеры INSTEAD OF INSERT.
Триггеры INSTEAD OF UPDATE должны использовать значения, предоставленные для вычисляемых столбцов, столбцов идентификаторов или столбцов с типом данных timestamp, только в условиях поиска предложения WHERE.
В триггере INSTEAD OF UPDATE по представлению для обработки обновленных значений вычисляемых столбцов, столбцов идентификаторов или столбцов с типом данных timestamp либо столбцов по умолчанию должна использоваться та же логика, что и логика, применяемая к вставленным значениям для столбцов этих типов.
Примечание |
---|
Триггеры INSTEAD OF UPDATE не могут быть определены для таблицы, внешний ключ которой определен с использованием действия UPDATE. |