Что касается триггеров обновления и вставки для MS SQL Server, есть ли способ сделать их атомарными? Другими словами, если во время триггера возникает ошибка, можно ли автоматически откатить исходную вставку или обновление?
MSSQL: что происходит, когда возникает ошибка во время выполнения триггера?
Ответы (2)
Триггеры After автоматически являются частью оператора вставки/обновления/удаления атомарного DML в таблице.
Вы просто выполняете команду ROLLBACK TRAN в триггере, чтобы отменить всю работу в триггере и исходном операторе I/U/D. Также выполняется откат самого внешнего транса, если он есть.
Важно
Откат в триггере для SQL 2000 и более ранних версий прерывает выполнение пакета. Никакой код после оскорбительного I/U/D не запустится. см. отличную статью Эрланда и другой
Для SQL 2005 с TRY/CATCH выполнение перейдет к блоку CATCH, и ваш пакет (он же хранимый процесс и т. д.) завершится нормально.
См. раздел откаты и фиксации в хранимых процедурах и триггерах. . Триггер и взаимодействие TRY/CATCH находятся здесь
В MSDN есть хорошая статья о триггерах и транзакциях, расположенная здесь:
http://msdn.microsoft.com/en-us/magazine/cc164032.aspx
По сути, вы хотите использовать транзакции, чтобы сделать операцию атомарной.