Любой триггер может содержать оператор INSERT, UPDATE, или DELETE, который затрагивает другую таблицу. Триггеры называются вложенными, когда триггер выполняет действие, которое начинает другой триггер.
Вы можете управлять вложенностью триггеров при использовании опции конфигурации сервера вложенных триггеров. Вложенность доступна при установке и устанавливается на уровне сервера, но Вы можете отменить и повторно сделать ее доступной при использовании системной хранимой процедуры sp_configure.
Триггеры могут быть вложены на глубину в 32 уровня. Когда триггер в цепочке вложений зацикливается, то превышается способность вложения. Тогда триггер останавливается, и транзакция откатывается. Вы можете использовать вложенные триггеры, чтобы выполнить такие функции, как восстановление копий строк, которые были испорчены предыдущим триггером.
Примите к сведению следующие факты, когда Вы используете вложенные триггеры:
■ По умолчанию опция конфигурации вложенности триггеров установлена в ON.
■ Вложенный триггер не будет срабатывать дважды на одну и ту же транзакцию триггера; триггер не вызывает сам себя в ответ на второе обновление той же самой таблицы в пределах триггера. Однако если триггер изменяет таблицу, что заставляет другой триггер срабатывать, а второй триггер изменяет эту таблицу, то первый триггер будет срабатывать рекурсивно. Чтобы предотвратить косвенную рекурсию такого вида, выключите опцию вложенных триггеров.
■, Поскольку триггер – это транзакция, отказ на любом уровне ряда вложенных триггеров отменяет всю транзакцию, и все модификации данных откатываются.
Поэтому, Вы должны включать операторы PRINT, когда Вы тестируете триггеры, чтобы Вы могли определить, где произошел отказ.
Уровень вложения увеличивается при каждом срабатывании вложенных триггеров. SQL Server поддерживает до 32 уровней вложения, но Вы могли бы ограничить уровни вложения, чтобы избежать превышения максимального уровня вложения. Вы можете использовать функцию @@NESTLEVEL, чтобы видеть текущие уровни вложения.
Вложения является сильной особенностью, которую Вы можете использовать, чтобы поддержать целостность данных по всей базе данных. Иногда, однако, Вы хотели бы отменить вложение. Если вложение отменено, триггеры не могут выполняться каскадом (триггер не может выполнять действие, на которое срабатывает другой триггер, который инициирует следующий триггер, и так далее).
Вы могли бы решить отменить вложение потому что:
■ Вложенные триггеры требуют сложного и хорошо запланированного проекта. Каскадирование изменений может привести к непреднамеренным модификациям данных.
■ Модификация данных в любой точке в серии вложенных триггеров отменяет серии триггеров. Хотя это предлагает мощную защиту для Ваших данных, может возникнуть проблема, если Ваши таблицы должны быть обновлены в определенной последовательности.
Используйте следующий оператор, чтобы отменить вложение.