Suponha que tenhamos a seguinte situação:
Temos uma tabela (digamos Table_A
), que tem um trigger em INSERT
. O trabalho do acionador é atualizar algumas linhas com table_B
base nos valores inseridos em table_A
.
Agora, está tudo bem quando simplesmente inserimos uma linha na tabela, mas e as situações em que inserimos dados por meio de uma transação? O gatilho esperará até que todas as instruções de transações sejam executadas com sucesso ou será acionada no momento em que reconhecer a inserção?. Se o gatilho disparar imediatamente ao reconhecer a primeira inserção, o que acontecerá se a transação falhar na última linha? Existe algum mecanismo para essa situação?.
Uma inserção está sempre dentro de uma transação.
Se você não tiver um explícito
BEGIN TRAN ... COMMIT
ouSET IMPLICIT_TRANSACTIONS ON
então a instrução será executada como uma transação de confirmação automática independente .O gatilho sempre faz parte da transação para a ação que dispara o gatilho. Se ocorrer um erro no gatilho que causa a reversão da transação, a ação de disparo também será revertida.
Os gatilhos estão ativados implicitamente
XACT_ABORT
. Um erro com essa configuração ativada levará automaticamente à reversão da transação (exceto para erros gerados no código com aRAISERROR
instrução).