Eu tenho um gatilho em uma tabela que inicia vários outros processos. No entanto, gostaria de garantir que, mesmo que os outros processos falhem, a inserção seja confirmada com sucesso na tabela original.
Eu tenho feito isso emitindo um explícito COMMIT TRAN
no gatilho antes de chamar meu outro procedimento. Isso parece ter funcionado bem, exceto por uma mensagem de erro feia:
Msg 3609, Nível 16, Estado 1, Linha 3 A transação terminou no gatilho. O lote foi abortado.
Ao fazer um pouco mais de pesquisa, mudei o procedimento, adicionando SET XACT_ABORT OFF;
no topo e removi o commit explícito. Isso parece ter tido o mesmo efeito.
Qual destes é preferível? Existem armadilhas que eu deveria estar ciente com qualquer um dos métodos?
Se você não tiver nenhum outro código no gatilho que deva ter permissão para cancelar o INSERT, tente o seguinte:
XACT_ABORT OFF
COMMIT TRAN
trásBEGIN TRAN
no final do gatilhoEste deve ser o mesmo problema como se você tivesse uma transação aberta, execute um proc e, nesse proc, faça um
ROLLBACK
(ou mesmo apenas umBEGIN TRAN
e noCOMMIT
ouROLLBACK
): haverá um erro dizendo que o valor de@@TRANCOUNT
é diferente entre entrar e sair do proc.