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


Указание первого и последнего триггеров

Возможно указать, что один из триггеров AFTER, связанных с таблицей, является либо первым триггером AFTER, либо последним триггером AFTER, срабатывающим для каждого запускающего действия INSERT, DELETE и UPDATE. Порядок запуска триггеров AFTER, срабатывающих в промежутке между первым и последним триггерами, не определен.

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

Параметр

Описание

First

Указывает, что триггер DML является первым триггером AFTER, срабатывающим для запускающего действия.

Last

Указывает, что триггер DML является последним триггером AFTER, срабатывающим для запускающего действия.

None

Указывает, что не существует определенного порядка, в соответствии с которым триггер DML должен срабатывать. Используется главным образом для смещения триггера с позиции первого или последнего.

В нижеследующем примере показано использование sp_settriggerorder:

sp_settriggerorder @triggername = 'MyTrigger', @order = 'first', @stmttype = 'UPDATE'
Важное примечаниеВажно!

Первый и последний триггеры должны быть двумя различными триггерами DML.

Для таблицы могут быть в одно и то же время определены триггеры INSERT, UPDATE и DELETE. Каждый тип инструкции может иметь свои собственные первый и последний триггеры, но они не могут быть одними и теми же триггерами.

Если первый или последний триггер, определенный для таблицы, не охватывает запускающее действие, то есть если он не охватывает FOR UPDATE, FOR DELETE или FOR INSERT, не существует первого или последнего триггера для отсутствующих действий.

Триггеры INSTEAD OF не могут быть указаны в качестве первого или последнего триггеров. Триггеры INSTEAD OF срабатывают до выполнения обновлений в базовых таблицах. Если обновления в базовых таблицах выполняются триггером INSTEAD OF, то эти обновления происходят прежде, чем срабатывают какие-либо триггеры AFTER, определенные для таблицы. Например, если триггер INSTEAD OF INSERT по представлению вставляет данные в базовую таблицу, а сама базовая таблица содержит триггер INSTEAD OF INSERT и три триггера AFTER INSERT, то триггер INSTEAD OF INSERT по базовой таблице срабатывает вместо действия вставки, а триггеры AFTER по базовой таблице срабатывают после выполнения любого действия вставки в базовой таблице. Дополнительные сведения см. в разделе Указание условий срабатывания DML-триггеров.

Если инструкция ALTER TRIGGER изменяет первый или последний триггер, атрибут First или Last удаляется и в качестве значения порядка указывается None. Порядок должен быть изменен с использованием sp_settriggerorder.

Функция OBJECTPROPERTY сообщает, является ли триггер первым или последним триггером, используя свойства ExecIsFirstTrigger и ExecIsLastTrigger.

Репликация автоматически создает первый триггер для любой таблицы, включенной в подписку немедленным обновлением или обновлением с постановкой в очередь. Для репликации требуется, чтобы его триггер был первым. При репликации выводится ошибка, когда предпринимается попытка включить таблицу с первым триггером в подписку немедленным обновлением или подписку обновлением с постановкой в очередь. При попытке сделать триггер первым триггером после включения таблицы в подписку sp_settriggerorder возвращает ошибку. В случае использования ALTER для триггера репликации или в случае использования sp_settriggerorder, чтобы сделать триггер репликации последним или триггером вне порядка, подписка не будет функционировать должным образом.