sp_settriggerorder (Transact-SQL)

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

Указывает AFTER триггеры, которые запускаются первым или последним. AFTER Триггеры, которые запускаются между первым и последним триггерами, выполняются в неопределенном порядке.

Соглашения о синтаксисе Transact-SQL

Синтаксис

sp_settriggerorder
    [ @triggername = ] N'triggername'
    , [ @order = ] 'order'
    , [ @stmttype = ] 'stmttype'
    [ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]

Аргументы

[ @triggername = ] N'triggername'

Имя триггера и схемы, к которой она принадлежит, если применимо, порядок которого должен быть задан или изменен. @triggername является nvarchar(517), без значения по умолчанию и имеет формат [ trigger_schema . ] trigger_name. Если имя не соответствует триггеру или если имя соответствует триггеру INSTEAD OF , процедура возвращает ошибку. Схему нельзя указать для триггеров DDL или входа.

[ @order = ] 'order'

Параметр для нового порядка триггера. @order — varchar(10) и может быть одним из следующих значений.

значение Описание
First Триггер срабатывает первым.
Last Триггер срабатывает последним.
None Порядок срабатывания триггера не определен.

Внимание

Last Триггеры First должны быть двумя разными триггерами.

[ @stmttype = ] 'stmttype'

Указывает инструкцию Transact-SQL, которая запускает триггер. @stmttype — varchar(50) и может быть INSERT, UPDATEили LOGONDELETEлюбым событием инструкции T-SQL, перечисленным в событиях DDL. Не удается указать группы событий.

Триггер можно назначить в качестве First или Last триггера для типа инструкции только после того, как этот триггер был определен как триггер для этого типа инструкции. Например, триггер TR1 можно назначить First для INSERT таблицы T1 , если TR1 он определен как INSERT триггер. Ядро СУБД возвращает ошибку, если TR1, которая была определена только как INSERT триггер, устанавливается как First триггер или Last триггер для инструкцииUPDATE. Дополнительные сведения см. в разделе с примечаниями.

@namespace = { 'DATABASE' | 'SERVER' | NULL }

Если @triggername является триггером DDL, @namespace указывает, был ли создан @triggername с областью базы данных или областью сервера. Если @triggername является триггером входа, SERVER необходимо указать. Дополнительные сведения о области триггеров DDL см. в разделе "Триггеры DDL". Если параметр не указан или NULL указан, @triggername является триггером DML.

Значения кода возврата

0 (успешно) и 1 (сбой).

Замечания

В этом разделе рассматриваются рекомендации по триггерам языка обработки данных (DML) и языка определения данных (DDL).

Триггеры DML

Для каждой инструкции в одной таблице может быть только один First и один Last триггер.

First Если триггер уже определен в таблице, базе данных или сервере, нельзя назначить новый триггер для First той же таблицы, базы данных или сервера для той же @stmttype. Это ограничение также применяет 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 Если оператор изменяет первый или последний триггер, исходный или Last атрибут, заданный в триггере, First удаляется, а значение заменяется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 AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'Sales.uSalesOrderHeader',
    @order = 'First',
    @stmttype = 'UPDATE';

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

В следующем примере указывается, что триггер ddlDatabaseTriggerLog является первым триггером для запуска после ALTER_TABLE возникновения события в AdventureWorks2022 базе данных.

USE AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'ddlDatabaseTriggerLog',
    @order = 'First',
    @stmttype = 'ALTER_TABLE',
    @namespace = 'DATABASE';