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
или LOGON
DELETE
любым событием инструкции 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, которые определены для одного события, следующий.
- Помеченный триггер уровня сервера
First
- Другие триггеры уровня сервера
- Помеченный триггер уровня сервера
Last
- Триггер уровня базы данных, помеченный
First
- Другие триггеры уровня базы данных
- Триггер уровня базы данных, помеченный
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';