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


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

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

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

Вариант Описание
First Указывает, что триггер DML является первым триггером AFTER, срабатывающим для запускающего действия.
Последняя Указывает, что триггер DML является последним триггером AFTER, срабатывающим для запускающего действия.
Не допускается Указывает, что не существует определенного порядка, в соответствии с которым триггер 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 Triggers.

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

Функция OBJECTPROPERTY сообщает, является ли триггер первым или последним, используя следующие свойства: ExecIsFirstInsertTrigger, ExecIsFirstUpdateTrigger, ExecIsFirstDeleteTrigger, ExecIsLastInsertTrigger, ExecIsLastUpdateTrigger и ExecIsLastDeleteTrigger.

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

См. также

OBJECTPROPERTY (Transact-SQL)
sp_settriggerorder (Transact-SQL)