SQL Server 2005 - цикл запуска? - PullRequest
2 голосов
/ 03 апреля 2009

Я впервые использую триггеры.

Если я обновлю поле в таблице с помощью триггера обновления в той же таблице, с помощью этого запускается цикл? Предохраняет ли sql server от такого рекурсивного поведения?

Спасибо

Ответы [ 2 ]

3 голосов
/ 03 апреля 2009

Эта страница (поиск RECURSIVE_TRIGGERS) описывает некоторые настройки базы данных, которые можно использовать для изменения этого поведения. Кроме того, одним из способов защиты ваших процедур является использование либо функции UPDATE(), либо функции COLUMNS_UPDATED().

Если, например, у вас есть таблица со столбцами A, B и C, и вы хотите, чтобы значение C автоматически изменялось при обновлении значения в столбце B, Вы можете защитить вызов в триггере:

CREATE TRIGGER Whatever ON TableName AFTER UPDATE
AS
BEGIN
    IF UPDATE(B)
    BEGIN
        /* Update column C here */
    END
END

Таким образом, вы избегаете рекурсивного вызова триггера, когда столбец C обновляется вашим триггером. COLUMNS_UPDATED() также полезно, но я нахожу его хрупким (зависит от положения столбца, а не от имени столбца).

1 голос
/ 03 апреля 2009

Вы можете контролировать рекурсию триггеров на уровне БД с помощью опции RECURSION_TRIGGER; он выключен по умолчанию. Даже если эта опция включена, существует ограничение в 32 вложенных уровня триггеров; все изменения будут отменены, если ваше условие выхода не остановило рекурсию до достижения предела в 32 уровня.

...