Подтвердить что ты не робот

Триггеры SQL Server - порядок выполнения

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

Спасибо.

4b9b3361

Ответ 1

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

Затем вы просто выполняете первый запуск в триггере.

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

sp_settriggerorder применяется только к триггерам AFTER.

Ответ 5

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

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

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

  • Первый - сначала запускается триггер
  • Last - запуск триггера последним
  • Нет. Триггер запускается в случайном порядке.

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

Например:

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

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

Сначала: сначала запускается триггер.

Последняя: триггер запускается последним.

Нет: триггер запускается в порядке undefined.

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

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

Ответ 9

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

sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'

Ответ 10

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

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

Источник: MSDN