Объединение обработки ошибки 266 и неотменяющегося запроса в триггере - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть хранимая процедура. По слишком распространенным причинам я использую хорошо зарекомендовавший себя блок 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. Это хорошее решение? Какие меры предосторожности следует предпринять в этом случае, чтобы минимизировать вероятность будущих ошибок?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...