sp_settriggerorder (Transact-SQL)
Изменения: 12 декабря 2006 г.
Указывает триггеры 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-события, используемые в триггерах DDL. Группы событий задавать нельзя.Триггер можно назначить первым (First) или последним (Last) для того или иного типа инструкций только после его определения в качестве триггера данного типа инструкций. Например, триггер TR1 можно назначить первым (First) для инструкции INSERT в таблице T1, если TR1 определен как триггер INSERT. Компонент SQL Server 2005 Database Engine вернет ошибку, если TR1, определенный только как триггер INSERT, устанавливается как первый (First) или последний (Last) триггер для инструкции UPDATE. Дополнительные сведения см. в разделе «Примечания».
- @namespace= { 'DATABASE' | 'SERVER' | NULL }
Если аргумент triggername является триггером DDL или триггером входа, указывается, был ли аргумент triggername создан в области базы данных или в области сервера. Обратите внимание, что триггеры входа можно создать только с областью сервера. Дополнительные сведения об области действия триггеров DDL см. в разделе Проектирование триггеров DDL. Если этот параметр не указан или указан равным NULL, то аргумент triggername является триггером DML.
Значения кодов возврата
0 (успешное завершение) и 1 (неуспешное завершение)
Замечания
Для каждой инструкции отдельной таблицы можно установить только один первый (First) и один последний (Last) триггер.
Если для таблицы, базы данных или сервера уже определен первый триггер First, нельзя назначить новый триггер как First для одного и того же типа инструкций statement_type. Это ограничение также применяется к последним триггерам (Last).
При репликации автоматически формируется первый триггер для любой таблицы, включенной в немедленно обновляемую подписку или подписку, обновляемую посредством очередей. Репликация требует, чтобы ее триггер был первым. При попытке вставить таблицу с указанным первым триггером в немедленно обновляемую подписку или подписку, обновляемую посредством очередей, репликация инициирует ошибку. При попытке сделать триггер первым после включения таблицы в подписку процедура sp_settriggerorder вернет ошибку. Если триггер репликации изменяется с помощью инструкции ALTER TRIGGER или в случае, если процедурой sp_settriggerorder его порядок меняется на последний (Last) или отсутствующий (None), подписка будет функционировать неправильно.
Если инструкцией 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';
См. также
Справочник
Системные хранимые процедуры (Transact-SQL)
Хранимые процедуры ядра СУБД (Transact-SQL)
ALTER TRIGGER (Transact-SQL)
Справка и поддержка
Получение помощи по SQL Server 2005
Журнал изменений
Версия | Журнал |
---|---|
12 декабря 2006 г. |
|