Поделиться через


Выполнение триггера 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

Срабатывает для всех базовых таблиц секционированного представления, для которых определен данный вид триггера.

Срабатывает для всех таблиц удаленного экземпляра, для которых определен данный вид триггера. Срабатывает только для задействованных в операции таблиц, находящихся на локальном экземпляре.