sp_settriggerorder (Transact-SQL)sp_settriggerorder (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Указывает триггеры AFTER, срабатывающие первыми или последними.Specifies the AFTER triggers that are fired first or last. Порядок запуска триггеров AFTER, срабатывающих в промежутке между первым и последним триггерами, не определен.The AFTER triggers that are fired between the first and last triggers are executed in undefined order.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

  
sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername'   
    , [ @order = ] 'value'   
    , [ @stmttype = ] 'statement_type'   
    [ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]  

АргументыArguments

[ @triggername = ] '[ _triggerschema.] _triggername' — это имя триггера и схема, к которой он принадлежит (если применимо), порядок которого должен быть установлен или изменен.[ @triggername = ] '[ _triggerschema.] _triggername' Is the name of the trigger and the schema to which it belongs, if applicable, whose order is to be set or changed. [тригжерсчема . ] triggername имеет тип sysname.[triggerschema.]triggername is sysname. Если имя не соответствует триггеру или соответствует триггеру INSTEAD OF, процедура возвращает ошибку.If the name does not correspond to a trigger or if the name corresponds to an INSTEAD OF trigger, the procedure returns an error. тригжерсчема нельзя указывать для триггеров DDL и logon.triggerschema cannot be specified for DDL or logon triggers.

[ @order = ] 'value' — это параметр для нового порядка триггера.[ @order = ] 'value' Is the setting for the new order of the trigger. value имеет тип varchar (10) и может принимать одно из следующих значений.value is varchar(10) and it can be any one of the following values.

Важно!

Первый и последний триггеры должны быть двумя разными триггерами.The First and Last triggers must be two different triggers.

ЗначениеValue ОписаниеDescription
ПерваяFirst Триггер срабатывает первым.Trigger is fired first.
ПоследняяLast Триггер срабатывает последним.Trigger is fired last.
НетNone Порядок срабатывания триггера не определен.Trigger is fired in undefined order.

[ @stmttype = ] 'statement_type' указывает инструкцию SQL, запускающую триггер.[ @stmttype = ] 'statement_type' Specifies the SQL statement that fires the trigger. statement_type имеет тип varchar (50) и может быть любым событием инструкции INSERT, Update, DELETE, logon или Any Transact-SQLTransact-SQL, перечисленных в DDL-событиях.statement_type is varchar(50) and can be INSERT, UPDATE, DELETE, LOGON, or any Transact-SQLTransact-SQL statement event listed in DDL Events. Группы событий задавать нельзя.Event groups cannot be specified.

Триггер можно назначить первым или последним триггером для типа инструкции только после того, как триггер был определен как триггер для этого типа инструкции.A trigger can be designated as the First or Last trigger for a statement type only after that trigger has been defined as a trigger for that statement type. Например, триггер TR1 может быть назначен первым для инструкции INSERT в таблице T1 , если TR1 определен как триггер INSERT.For example, trigger TR1 can be designated First for INSERT on table T1 if TR1 is defined as an INSERT trigger. Компонент Database EngineDatabase Engine возвращает ошибку, если TR1, который был определен только как триггер INSERT, устанавливается в качестве первогоили последнеготриггера для инструкции UPDATE.The Компонент Database EngineDatabase Engine returns an error if TR1, which has been defined only as an INSERT trigger, is set as a First, or Last, trigger for an UPDATE statement. Дополнительные сведения см. в разделе «Примечания».For more information, see the Remarks section.

@Namespace = { "Database" | "Server" | ЗАКАНЧИВАЮЩ@namespace= { 'DATABASE' | 'SERVER' | NULL }
Если triggername является триггером DDL, @Namespace указывает, была ли создана triggername с областью базы данных или областью сервера.When triggername is a DDL trigger, @namespace specifies whether triggername was created with database scope or server scope. Если triggername является триггером входа, необходимо указать Server.If triggername is a logon trigger, SERVER must be specified. Дополнительные сведения об области триггера DDL см. в разделе триггеры DDL.For more information about DDL trigger scope, see DDL Triggers. Если не указано или указано значение NULL, triggername является триггером DML.If not specified, or if NULL is specified, triggername is a DML trigger.

СЕРВЕР применяется к: SQL Server 2008SQL Server 2008 и более поздних версий.SERVER applies to: SQL Server 2008SQL Server 2008 and later.

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

0 (успешное завершение) и 1 (неуспешное завершение)0 (success) and 1 (failure)

RemarksRemarks

Триггеры DMLDML Triggers

Для каждой инструкции в одной таблице может быть только один первый и один последний триггер.There can be only one First and one Last trigger for each statement on a single table.

Если первый триггер уже определен для таблицы, базы данных или сервера, нельзя назначить новый триггер первым для той же таблицы, базы данных или сервера для той же statement_type.If a First trigger is already defined on the table, database, or server, you cannot designate a new trigger as First for the same table, database, or server for the same statement_type. Это ограничение также применяет последние триггеры.This restriction also applies Last triggers.

Репликация автоматически создает первый триггер для любой таблицы, включенной в подписку немедленным обновлением или обновлением с постановкой в очередь.Replication automatically generates a first trigger for any table that is included in an immediate updating or queued updating subscription. Репликация требует, чтобы ее триггер был первым.Replication requires that its trigger be the first trigger. При попытке вставить таблицу с указанным первым триггером в немедленно обновляемую подписку или подписку, обновляемую посредством очередей, репликация инициирует ошибку.Replication raises an error when you try to include a table with a first trigger in an immediate updating or queued updating subscription. При попытке сделать триггер первым триггером после включения таблицы в подписку sp_settriggerorder возвращает ошибку.If you try to make a trigger a first trigger after a table has been included in a subscription, sp_settriggerorder returns an error. При использовании инструкции ALTER TRIGGER для триггера репликации или при использовании sp_settriggerorder для изменения триггера репликации на последний или ни один триггер, подписка работает неправильно.If you use ALTER TRIGGER on the replication trigger, or use sp_settriggerorder to change the replication trigger to a Last or None trigger, the subscription does not function correctly.

Триггеры DDLDDL Triggers

Если в одном событии существует триггер DDL с областью базы данных и триггер DDL с областью сервера, то можно указать, что оба триггера являются первым триггером или последним триггером.If a DDL trigger with database scope and a DDL trigger with server scope exist on the same event, you can specify that both triggers be a First trigger or a Last trigger. Триггеры сервера всегда запускаются в первую очередь.However, server-scoped triggers always fire first. Порядок выполнения триггеров DDL, которые определены для одного события, следующий.In general, the order of execution of DDL triggers that exist on the same event is as follows:

  1. Триггер уровня сервера, помеченный как первый.The server-level trigger marked First.

  2. Другие триггеры сервера.Other server-level triggers.

  3. Триггер уровня сервера, помеченный последним.The server-level trigger marked Last.

  4. Триггер уровня базы данных, помеченный как First.The database-level trigger marked First.

  5. Другие триггеры базы данных.Other database-level triggers.

  6. Триггер уровня базы данных, помеченный последним.The database-level trigger marked Last.

Общие соглашения о триггерахGeneral Trigger Considerations

Если инструкция ALTER TRIGGER изменяет первый или последний триггер, первый или последний атрибут, изначально заданный для триггера, удаляется, а значение заменяется на None.If an ALTER TRIGGER statement changes a first or last trigger, the First or Last attribute originally set on the trigger is dropped, and the value is replaced by None. Значение порядка должно быть сброшено с помощью sp_settriggerorder.The order value must be reset by using sp_settriggerorder.

Если один и тот же триггер должен быть указан в качестве первого или последнего заказа для более чем одного типа инструкции, sp_settriggerorder должны выполняться для каждого типа инструкции.If the same trigger must be designated as the first or last order for more than one statement type, sp_settriggerorder must be executed for each statement type. Кроме того, триггер необходимо сначала определить для типа инструкции, прежде чем его можно будет назначить первым или последним триггером для этого типа инструкции.Also, the trigger must be first defined for a statement type before it can be designated as the First or Last trigger to fire for that statement type.

РазрешенияPermissions

Чтобы установить порядок запуска триггера DDL сервера (созданного с помощью ON ALL SERVER) или триггера входа, необходимо разрешение CONTROL SERVER.To set the order of a DDL trigger with server scope (created ON ALL SERVER) or a logon trigger requires CONTROL SERVER permission.

Чтобы установить порядок запуска триггера DDL базы данных (созданного с помощью ON DATABASE), необходимо разрешение ALTER ANY DATABASE DDL TRIGGER.To set the order of a DDL trigger with database scope (created ON DATABASE) requires ALTER ANY DATABASE DDL TRIGGER permission.

Чтобы установить порядок запуска триггера DML, необходимо разрешение ALTER на таблицу или представление, для которых этот триггер определен.To set the order of a DML trigger requires ALTER permission on the table or view on which the trigger is defined.

ПримерыExamples

A.A. Установка порядка срабатывания триггера DMLSetting the firing order for a DML trigger

На этом примере показано, как указывается, что триггер uSalesOrderHeader должен срабатывать первым после выполнения операции UPDATE над таблицей Sales.SalesOrderHeader.The following example specifies that trigger uSalesOrderHeader be the first trigger to fire after an UPDATE operation occurs on the Sales.SalesOrderHeader table.

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

б.B. Установка порядка срабатывания триггера DDLSetting the firing order for a DDL trigger

На этом пример показано, как указывается, что триггер ddlDatabaseTriggerLog должен срабатывать первым после события ALTER_TABLE в базе данных AdventureWorks2012AdventureWorks2012.The following example specifies that trigger ddlDatabaseTriggerLog be the first trigger to fire after an ALTER_TABLE event occurs in the AdventureWorks2012AdventureWorks2012 database.

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

См. также статьюSee Also

Системные хранимые процедуры (Transact-SQL) System Stored Procedures (Transact-SQL)
Transact- (SQL) ядро СУБД хранимых процедурDatabase Engine Stored Procedures (Transact-SQL)
ALTER TRIGGER (Transact-SQL)ALTER TRIGGER (Transact-SQL)