2009-10-26 1 views
0

Я знаю о настройке сервера «Разрешить триггеры для других», который позволяет действию, предпринимаемому триггером, запускать другой триггер (или нет), и, насколько я понимаю, мои единственные варианты: True (разрешить триггер запускать другие триггеры, что может привести к бесконечной рекурсии) или False (действия, предпринимаемые триггерами, не будут запускать какие-либо другие триггеры, что может привести к неожиданным результатам или непоследовательным данным)."Максимально допустимая глубина запуска" в SQL Server?

Есть ли способ обеспечить «максимальную глубину триггера» в SQL Server? Я использую 2008, если это имеет значение, хотя я не знаю об этой функции в любой версии (или в любой другой СУБД, если на то пошло, хотя мои знания, по общему признанию, ограничены). Например, вот что мне хотелось бы:

  1. Установите «Максимальная глубина запуска» на «2».
  2. я вставить строку в table1
  3. Триггер на TABLE1 вставок в table2
  4. Триггер на table2 вставок в Table3
  5. Там в триггер на Table3, что бы вставить в table4, но так как максимальная глубина 2 , либо триггер просто не запускается (менее идеален, но согласуется с текущим «Рекурсивным триггером = ложным» поведением на SQL Server), или весь набор вставок откатывается назад и терпит неудачу с ошибкой типа «Максимальная глубина триггера (2) превышено - вставить сбой "сообщение (идеальное)

Кто-нибудь t знаете, возможно ли это, или если есть выдающийся запрос функции для этого поведения? Если я сумасшедший, и это ужасная идея поведения, я открыт для этого, но я хотел бы знать, почему (непреднамеренные последствия и т. Д.).

ответ

4

Внутри триггера, вы можете проверить уровень вложенности, и необязательно возвращать:

IF (TRIGGER_NESTLEVEL() > 2) 
    RETURN 

Смотрите эту blog post для более подробной информации.

+0

exec sp_CONFIGURE 'nested_triggers' может принимать значения только 0 или 1. –

+0

@Lukasz Lysik: Вы правы, пост отредактировал – Andomar

+0

Это сообщение в блоге именно то, что я искал - спасибо. Не могу поверить, что я не знал об этой функции – SqlRyan