Выполнение триггера DML
Триггеры AFTER никогда не выполняются при нарушении ограничений, поэтому применение данных триггеров не допускается в тех случаях, когда обработка может предотвращать нарушения ограничений.
Триггеры INSTEAD OF выполняются вместо действий, запускающих триггеры. Эти триггеры выполняются после создания вставленных и удаленных таблиц, отражающих изменения в базовых таблицах, но до выполнения каких-либо иных действий. Они выполняются до каких-либо ограничений и могут, таким образом, выполнять операции предварительной обработки, которые дополняют действия применения ограничений.
Если триггер INSTEAD OF, определенный для таблицы, выполняет применительно к данной таблице инструкцию, которая обычно вновь запускает триггер INSTEAD OF, этот триггер не вызывается рекурсивно. Вместо этого инструкция обрабатывается так, как если бы в таблице отсутствовал триггер INSTEAD OF, и начинается последовательность выполнения операций ограничения и триггера AFTER. Например, если триггер DML определен для таблицы как триггер INSTEAD OF INSERT и если этот триггер выполняет применительно к данной таблице инструкцию INSERT, эта инструкция INSERT, выполненная триггером INSTEAD OF, не осуществляет повторный вызов триггера. Команда INSERT, выполняемая триггером, начинает процесс действий применения ограничений и обработки всех триггеров AFTER INSERT, определенных для данной таблицы.
Если триггер INSTEAD OF, определенный для представления, выполняет применительно к данному представлению инструкцию, которая обычно вновь запускает триггер INSTEAD OF, он не вызывается рекурсивно. Вместо этого инструкция выполняется в виде изменений базовых таблиц, составляющих представление. В этом случае определение представления должно соответствовать всем ограничениям, налагаемым на обновляемое представление. Сведения об определении обновляемых представлений см. в разделе Изменение данных через представление. Например, если триггер DML определен для представления как триггер INSTEAD OF UPDATE и если этот триггер выполняет применительно к данному представлению инструкцию UPDATE, эта инструкция UPDATE, выполненная триггером INSTEAD OF, не осуществляет повторный вызов триггера. Инструкция UPDATE, выполняемая в триггере, обрабатывает представление так, как если бы в представлении не имелось триггера INSTEAD OF. Столбцы, измененные с помощью инструкции UPDATE, должны разрешаться в одну базовую таблицу. Каждое изменение базовой таблицы запускает последовательность применения ограничений и обработки триггеров AFTER, определенных для данной таблицы.
Как правило, выполнение триггеров DML не приводит к существенному снижению производительности. Время, расходуемое на выполнение триггеров DLM, затрачивается в основном на осуществление ссылок на другие таблицы, которые могут храниться в памяти или на устройстве базы данных. Таблицы deleted и inserted всегда хранятся в памяти. Время, необходимое для выполнения операции, определяется местом размещения таблиц, на которые ссылается триггер.
Примечание |
---|
Использование курсоров в триггерах DML не рекомендуется вследствие возможного негативного влияния на производительность. При проектировании воздействующих на несколько строк триггеров DML следует использовать не курсоры, а логику, основанную на наборах строк. |
Выполнение триггера DML и секционированные представления
Способ срабатывания триггеров UPDATE и DELETE для базовых таблиц секционированного представления был изменен по сравнению с SQL Server 2000. В SQL Server 2000 при выполнении инструкции UPDATE или DELETE для локального или распределенного секционированного представления, срабатывают все триггеры UPDATE или DELETE, определенные для базовых таблиц данного представления, в том числе триггеры таблиц, на которых операция обновления или удаления не отразится. В SQL Server 2008 и SQL Server 2005 триггеры UPDATE или DELETE срабатывают, только если базовая таблица, для которой определены эти триггеры, задействована в операциях обновления или удаления. Аналогично ведут себя триггеры AFTER и INSTEAD OF.
Например, рассмотрим секционированное представление PV, состоящее из полей таблиц T1 и T2. Для обеих таблиц T1 и T2 определены триггеры UPDATE. В SQL Server 2000 выполнение инструкции UPDATE для PV, действия которой затрагивают только строки таблицы T1, приведет к срабатыванию триггеров UPDATE в обеих таблицах T1 и T2. В SQL Server 2008 и SQL Server 2005 сработают только определенные для таблицы T1 триггеры UPDATE.
В следующей таблице подведены итоги по изменению в поведении триггеров.
Операции вставки, обновления или удаления для локального секционированного представления
SQL Server 2000 |
Текущая версия |
|
---|---|---|
INSERT TRIGGER |
Срабатывает только для задействованных в операции таблиц. |
Срабатывает только для задействованных в операции таблиц. |
UPDATE TRIGGER |
Срабатывает для всех базовых таблиц секционированного представления, для которых определен данный вид триггера. |
Срабатывает только для задействованных в операции таблиц. |
DELETE TRIGGER |
Срабатывает для всех базовых таблиц секционированного представления, для которых определен данный вид триггера. |
Срабатывает только для задействованных в операции таблиц. |
Операции вставки, обновления или удаления для распределенного секционированного представления
SQL Server 2000 |
Текущая версия |
|
---|---|---|
INSERT TRIGGER |
Срабатывает только для задействованных в операции таблиц распределенного секционированного представления. Могут сработать триггеры, определенные для таблиц на локальном и удаленном экземплярах, если таблицы задействованы в операции. |
Срабатывает только для задействованных в операции таблиц распределенного секционированного представления. Могут сработать триггеры, определенные для таблиц на локальном и удаленном экземплярах, если таблицы задействованы в операции. |
UPDATE TRIGGER |
Срабатывает для всех базовых таблиц секционированного представления, для которых определен данный вид триггера. |
Срабатывает для всех таблиц удаленного экземпляра, для которых определен данный вид триггера. Срабатывает только для задействованных в операции таблиц, находящихся на локальном экземпляре. |
DELETE TRIGGER |
Срабатывает для всех базовых таблиц секционированного представления, для которых определен данный вид триггера. |
Срабатывает для всех таблиц удаленного экземпляра, для которых определен данный вид триггера. Срабатывает только для задействованных в операции таблиц, находящихся на локальном экземпляре. |
См. также