#sql-server #tsql #triggers #dml
Вопрос:
Я пытаюсь понять триггеры SQL Server. В качестве примера у нас есть сценарий с таблицей, для которой есть несколько триггеров insert
.
Если у нас возникнет проблема в последнем триггере, выдаст ошибку и вызовет откат транзакции, будут ли откатываться и предыдущие триггеры?
В этом сценарии мы говорим о триггерах DML, и они являются последовательными, а не вложенными. Мы также имеем в виду два или три триггера вставки или обновления. Мы используем порядок триггеров, поэтому мы знаем, какой триггер в серии является «последним» триггером для выполнения.
Комментарии:
1. Ну, все триггеры выполняются в контексте транзакции, которая вызвала их срабатывание, — того
INSERT
оператора, который вызвал их срабатывание. Таким образом, любой откат триггера приведет к откату всей транзакции —INSERT
инструкции и любых предыдущих операций триггера2. Я предлагаю вам обратить внимание на проблему обслуживания, которую вызывают триггеры, и рассмотреть решение, которое, по возможности, не использует никаких триггеров
3. Спасибо, Марк, вы говорите, что да, вся вставка (например) будет откатана, поэтому триггеры и фактическая вставка завершатся неудачей, потому что полная серия триггеров не будет зафиксирована. Это правильно?
4. @Ник. Макдермейд, это не вариант. Поставщик добавил 1 или 2 триггера, и если мы добавим свои собственные, мне нужно понять, что произойдет, если один из них ошибется и вызовет откат. В ходе нашего тестирования мы увидели, на что указал marc_s, но я хочу быть уверенным в процессе транзакции.
5. Я говорю: исходная операция (ваша
INSERT
) и любой триггер(ы) будут выполняться в рамках одной транзакции , и если вы откатите транзакцию, все внесенные в нее изменения будут возвращены обратно