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


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'
    Указывает инструкцию SQL, которая запускает триггер. Аргумент 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, которые определены для одного события, следующий.

  1. Триггер сервера, обозначенный как First.

  2. Другие триггеры сервера.

  3. Триггер сервера, обозначенный как Last.

  4. Триггер базы данных, обозначенный как First.

  5. Другие триггеры базы данных.

  6. Триггер базы данных, обозначенный как 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 на таблицу или представление, для которых этот триггер определен.

Примеры

A. Установка порядка срабатывания триггера DML

На этом примере показано, как указывается, что триггер uSalesOrderHeader должен срабатывать первым после выполнения операции UPDATE над таблицей Sales.SalesOrderHeader.

USE AdventureWorks;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';

Б. Установка порядка срабатывания триггера DDL

На этом пример показано, как указывается, что триггер ddlDatabaseTriggerLog должен срабатывать первым после события ALTER_TABLE в базе данных AdventureWorks.

USE AdventureWorks;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';