Gatilho em combinação com transação

25

Suponha que tenhamos a seguinte situação:

Temos uma mesa (digamos Table_A), que tem um gatilho INSERT. O trabalho do acionador é atualizar algumas linhas com table_Bbase 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 aguardará até que todas as instruções de transações sejam executadas com êxito ou será acionado no momento em que reconhecer a inserção? Se o gatilho for acionado imediatamente quando reconhecer a primeira inserção, o que acontecerá se a transação falhar na última linha ?. Existe algum mecanismo para essa situação?

veljasije
fonte

Respostas:

37

Uma inserção está sempre dentro de uma transação.

Se você não possui um explícito BEGIN TRAN ... COMMITou SET IMPLICIT_TRANSACTIONS ONa instrução é executada como uma transação de confirmação automática independente .

O gatilho sempre faz parte da transação da 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 implicitamente estão ativados XACT_ABORT. Um erro com essa configuração ativada levará automaticamente à reversão da transação (exceto pelos erros gerados no código com a RAISERRORinstrução).

Martin Smith
fonte