У меня есть хранимая процедура. По слишком распространенным причинам я использую хорошо зарекомендовавший себя блок try-tran:
begin try
begin transaction
--(actual code here)
commit
end try
begin catch
if @@trancount > 0 rollback
-- do error handling stuff
-- re-throw the error
end catch
Я хочу, чтобы этот spc мог вызываться один. Я также не ценю тот факт, что оператор типа select * from nonexistent_table
выдаст ошибку 266, которая обрабатывается на верхнем уровне 1006 *. Так что, если нет верхнего уровня, он не будет обработан и оставит меня с открытой транзакцией. Чтобы это исправить, я использовал
SET XACT_ABORT ON
в начале блока try-catch.
Теперь все становится немного сложнее, когда я пытаюсь включить это в триггер. Дело в том, что я хочу, чтобы триггер выполнил вставку, а затем вызвал процедуру, не отменяя вставку, если она не удалась. Один из способов сделать это - переопределить состояние триггера по умолчанию, добавив SET XACT_ABORT OFF
перед вызовом proc. Тем не менее, proc установит для него значение OFF и тем самым разрушит это решение.
Из того, что я прочитал, альтернативой было бы использовать COMMIT
и BEGIN TRAN
в триггере перед вызовом proc (триггер должен сам сделать COMMIT
. Это хорошее решение? Какие меры предосторожности следует предпринять в этом случае, чтобы минимизировать вероятность будущих ошибок?