Триггеры SQL Server - порядок выполнения - PullRequest
29 голосов
/ 18 сентября 2008

Кто-нибудь знает, как SQL Server определяет триггеры порядка (того же типа, т.е. перед триггерами). И есть ли способ изменить это, чтобы я мог указать порядок, который я хочу. Если нет, то почему бы и нет.

Спасибо.

Ответы [ 10 ]

18 голосов
/ 18 сентября 2008

Использование SetTriggerOrder - это нормально, но если ваш код зависит от определенной последовательности выполнения, почему бы не обернуть все ваши триггеры в хранимые процедуры и не вызвать первый вызов второго, второй вызов третьего и т. Д.

Тогда вы просто выполняете первый в триггере.

Кто-то в будущем будет благодарен за то, что ему не пришлось копаться в системной таблице для определения пользовательской последовательности выполнения.

14 голосов
/ 18 сентября 2008

Вы можете использовать sp_settriggerorder , чтобы определить порядок каждого триггера на столе.

Тем не менее, я бы сказал, что вам будет гораздо лучше иметь один триггер, который делает несколько вещей. Это , в частности , поэтому, если порядок важен, так как эта важность не будет очень очевидной, если у вас есть несколько триггеров. Представьте, что кто-то пытается поддерживать базу данных месяцами / годами в будущем. Конечно, могут быть случаи, когда вам нужно иметь несколько триггеров, или это действительно лучший дизайн, но я бы начал предполагать, что вы должны иметь один и работать оттуда.

11 голосов
/ 18 сентября 2008

Если вы на пороге беспокойства по поводу триггерных ордеров, тогда вам действительно следует сделать шаг назад и подумать о том, что вы пытаетесь сделать, и если есть лучший способ сделать это. Тот факт, что это не легко изменить, должен вам кое-что сказать.

Триггеры всегда выглядят как настоящее аккуратное решение, и в нужном месте они очень ценны, , но цена высока, с ними действительно легко создавать отладочные кошмары. Я потерял много часов в прошлом, пытаясь отладить неясное поведение базы данных, только чтобы найти причину, скрытую в пропущенном триггере.

5 голосов
/ 18 сентября 2008

sp_settriggerorder применяется только к триггерам ПОСЛЕ.

4 голосов
/ 18 сентября 2008

Вы можете гарантировать, какой триггер срабатывает первым, какой триггер срабатывает последним, а какой срабатывает посередине, используя sp_settriggerorder. Если вам нужно синхронизировать более трех, это не представляется возможным в SQL Server 2005.

Вот пример, взятый из здесь (Связанная статья содержит гораздо больше информации).

sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
4 голосов
/ 18 сентября 2008

Используйте sp_Settriggerorder хранимую процедуру, вы можете определить порядок выполнения триггера.

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

Второй параметр, «заказ», может принимать три значения, что означает, что он может учитывать до трех триггеров.

  1. Первый - триггер срабатывает первым
  2. Last - срабатывает в последний раз
  3. Нет - триггер срабатывает в случайном порядке.
2 голосов
/ 06 сентября 2013

Используйте это:

Например:

USE AdventureWorks;
GO
EXEC sys.sp_settriggerorder @triggername = N'', -- nvarchar(517)
    @order = '', -- varchar(10)
    @stmttype = '', -- varchar(50)
    @namespace = '' -- varchar(10)

Первый и последний триггеры должны быть двумя разными триггерами.

Первый: триггер срабатывает первым.

Последний: триггер срабатывает последним.

Нет: триггер срабатывает в неопределенном порядке.

И посмотрите эту ссылку для значения @stmttype: DDL Events

И для @namespace = {'DATABASE' | 'СЕРВЕР' | NULL} и для получения дополнительной информации см .: Триггеры DDL

2 голосов
/ 18 сентября 2008

Порядок устанавливается сервером sql, единственное, что вы можете сделать, это использовать системный sp (sp_settriggerorder), чтобы установить, какой триггер будет срабатывать первым, а какой - последним.

Помимо установки первого и последнего триггеров, вы не можете изменить или сказать, какой порядок будет использовать сервер sql. Поэтому вы захотите создать свои триггеры, чтобы они не зависели от того, в каком порядке они запущены. Даже если вы определите порядок, в котором они стреляют сегодня, он может измениться завтра.

Эта информация основана на Sql Server 2000, однако я не верю, что 2005/2008 действуют в этом отношении иначе.

1 голос
/ 07 апреля 2013

Заявление на миллион долларов в этом контексте -

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

Источник: MSDN

1 голос
/ 18 сентября 2008

Используйте эту системную хранимую процедуру:

sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...