Если в таблице имеется более одного триггера FOR INSERT, и один из них выполняет запись в таблицу аудита, а другой выполняет откат, выполняется откат аудита - PullRequest
0 голосов
/ 08 ноября 2019

Допустим, в таблице есть триггер проверки, который применяет некоторую бизнес-логику:

TRG_MYTABLE_INSERT_UPDATE_VALIDATION
FOR INSERT, UPDATE on MYTABLE

и триггер аудита, который записывает все вставки и обновления в другую таблицу.

TRG_MYTABLE_INSERT_UPDATE_AUDIT
FOR INSERT, UPDATE on MYTABLE

инет никакой гарантии, что они будут выполнены в определенном порядке, будет ли откат в триггере VALIDATION откатить запись в таблицу аудита?

Все ли триггеры зачислены в одну и ту же транзакцию "за кадром"?

1 Ответ

1 голос
/ 08 ноября 2019

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

Кроме того, вТриггеры SQL Server по умолчанию запускаются в XACT_ABORT ON, что означает, что если в триггере произойдет ошибка, транзакция WHOLE будет немедленно отменена.

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

Однако вы можете сделать SET XACT_ABORT OFF в своем коде транзакции, и в этом случае откат повлияет только на то, что вы делаете в триггере. ,То есть UNLESS ваш код вызова запускает транзакцию, и вы явно делаете ROLLBACK в своем триггере.

Вышесказанное объясняет, почему вы должны быть очень осторожны с использованием триггеров в первую очередь,

...