Выключить триггеры, если транзакция завершилась неудачей в SQL Server?

У меня есть некоторые триггеры в некоторых таблицах, которые выполняют функцию, когда что-то удаляется или обновляется. Во время транзакции, если запускается триггер, а затем в транзакции он откатывается, срабатывает ли триггер и обратно?

Ответ 1

Да.

Пока триггер срабатывает как часть транзакции, любые изменения в make в базе данных также будут откатны.

Nitpick - триггер - это триггер, он не будет откатываться назад. Эффект триггера будет.

Ответ 2

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

Итак, если я удалю из таблицы1, а срабатывает триггер, а затем транзакция завершится неудачно, все будет откат.

Если я удалю из таблицы 1 и срабатывает триггер, и я удалю из таблицы2 как часть того же script или сохраненного proc или dynamicSQL, отправленного из приложения, тогда могут произойти две вещи. Если у вас есть формальная явная транзакция (которая правильно обрабатывает ошибки), все, что происходит, включая триггерные действия, откатывается назад, если вы полагаетесь на неявную транзакцию (которая только откатывается от последнего действия), то она ничего не изменит до часть, которая не удалась.