sp_settriggerorder (Transact-SQL)
Указывает триггеры AFTER, срабатывающие первыми или последними. Порядок запуска триггеров AFTER, срабатывающих в промежутке между первым и последним триггерами, не определен.
Синтаксические обозначения в Transact-SQL
Синтаксис
sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername'
, [ @order = ] 'value'
, [ @stmttype = ] 'statement_type'
[ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]
Аргументы
[ @triggername= ] '[ triggerschema**.] triggername'**
Имя триггера, порядок срабатывания которого нужно установить или изменить, и схема, которой он принадлежит, если таковая имеется. [Аргумент triggerschema**.**]triggername имеет тип sysname. Если имя не соответствует триггеру или соответствует триггеру INSTEAD OF, процедура возвращает ошибку. triggerschema не может указываться для триггеров DDL или триггеров входа.[ @order= ] 'value'
Новый порядок срабатывания для триггера. Аргумент value имеет тип varchar(10) и может принимать любое из следующих значений.Важно! Первый (First) и последний (Last) триггеры должны быть различными.
Значение
Описание
First
Триггер срабатывает первым.
Last
Триггер срабатывает последним.
None
Порядок срабатывания триггера не определен.
[ @stmttype= ] 'statement_type'
Указывает инструкцию DDL, которая активирует триггер. Аргумент statement_type имеет тип varchar(50) и может принимать значения INSERT, UPDATE, DELETE, LOGON или любого события инструкции Transact-SQL из списка DDL-события. Группы событий задавать нельзя.Триггер можно назначить первым (First) или последним (Last) для того или иного типа инструкций только после его определения в качестве триггера данного типа инструкций. Например, триггер TR1 можно назначить первым (First) для инструкции INSERT в таблице T1, если TR1 определен как триггер INSERT. Компонент Компонент Database Engine вернет ошибку, если TR1, определенный только как триггер INSERT, устанавливается как первый (First) или последний (Last) триггер для инструкции UPDATE. Дополнительные сведения см. в разделе «Примечания».
@namespace= { 'DATABASE' | 'SERVER' | NULL }
Если аргумент triggername является триггером DDL, указывается, был ли аргумент triggername создан в области базы данных или в области сервера. Если триггер triggername является триггером входа, должен быть указан параметр SERVER. Дополнительные сведения об области действия триггеров DDL см. в разделе Триггеры DDL. Если этот параметр не указан или указан равным NULL, то аргумент triggername является триггером DML.
Значения кодов возврата
0 (успешное завершение) и 1 (неуспешное завершение)
Замечания
Триггеры DML
Для каждой инструкции отдельной таблицы можно установить только один первый (First) и один последний (Last) триггер.
Если для таблицы, базы данных или сервера уже определен первый триггер First, нельзя назначить новый триггер как First для одного и того же типа инструкций statement_type. Это ограничение также применяется к последним триггерам (Last).
При репликации автоматически формируется первый триггер для любой таблицы, включенной в немедленно обновляемую подписку или подписку, обновляемую посредством очередей. Репликация требует, чтобы ее триггер был первым. При попытке вставить таблицу с указанным первым триггером в немедленно обновляемую подписку или подписку, обновляемую посредством очередей, репликация инициирует ошибку. При попытке сделать триггер первым после включения таблицы в подписку процедура sp_settriggerorder вернет ошибку. Если триггер репликации изменяется с помощью инструкции ALTER TRIGGER или в случае, если процедурой sp_settriggerorder его порядок меняется на последний (Last) или отсутствующий (None), подписка будет функционировать неправильно.
Триггеры DDL
Если для одного и того же события существуют триггер DDL базы данных и триггер DDL сервера, можно определить оба триггера в качестве триггера First или триггера Last. Триггеры сервера всегда запускаются в первую очередь. Порядок выполнения триггеров DDL, которые определены для одного события, следующий.
Триггер сервера, обозначенный как First.
Другие триггеры сервера.
Триггер сервера, обозначенный как Last.
Триггер базы данных, обозначенный как First.
Другие триггеры базы данных.
Триггер базы данных, обозначенный как Last.
Общие соглашения о триггерах
Если инструкцией ALTER TRIGGER изменяется первый или последний триггер, изначально установленный этому триггеру атрибут First или Last удаляется, а значение заменяется None. Значение порядка должно быть повторно установлено процедурой sp_settriggerorder.
Если один и тот же триггер необходимо назначить в качестве первого или последнего для нескольких типов инструкций, процедуру sp_settriggerorder необходимо выполнить для каждого типа инструкций. Кроме того, прежде чем триггер может быть назначен в качестве первого (First) или последнего (Last) выполняющегося триггера для того или иного типа инструкций, этот триггер должен быть сначала определен для данного типа.
Разрешения
Чтобы установить порядок запуска триггера DDL сервера (созданного с помощью ON ALL SERVER) или триггера входа, необходимо разрешение CONTROL SERVER.
Чтобы установить порядок запуска триггера DDL базы данных (созданного с помощью ON DATABASE), необходимо разрешение ALTER ANY DATABASE DDL TRIGGER.
Чтобы установить порядок запуска триггера DML, необходимо разрешение ALTER на таблицу или представление, для которых этот триггер определен.
Примеры
А.Установка порядка срабатывания триггера DML
На этом примере показано, как указывается, что триггер uSalesOrderHeader должен срабатывать первым после выполнения операции UPDATE над таблицей Sales.SalesOrderHeader.
USE AdventureWorks2012;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';
Б.Установка порядка срабатывания триггера DDL
На этом пример показано, как указывается, что триггер ddlDatabaseTriggerLog должен срабатывать первым после события ALTER_TABLE в базе данных AdventureWorks2012 .
USE AdventureWorks2012;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';
См. также
Справочник
Системные хранимые процедуры (Transact-SQL)