Disparador en combinación con transacción

25

Supongamos que tenemos la siguiente situación:

Tenemos una tabla (digamos Table_A), que tiene un activador activado INSERT. El trabajo desencadenante es actualizar algunas filas en table_Bfunción de los valores insertados en table_A.

Ahora, todo está bien cuando simplemente insertamos una fila en la tabla, pero ¿qué pasa con las situaciones en las que insertamos datos a través de una transacción? ¿El disparador esperará hasta que todas las declaraciones de transacciones se ejecuten correctamente, o se disparará en el momento en que reconozca la inserción? Si el disparador se dispara inmediatamente cuando reconoce la primera inserción, ¿qué sucederá si la transacción falla en la última fila? ¿Hay algún mecanismo para esa situación?

veljasije
fuente

Respuestas:

37

Una inserción siempre está dentro de una transacción.

Si no tiene una declaración explícita BEGIN TRAN ... COMMITo SET IMPLICIT_TRANSACTIONS ONla declaración se ejecuta como una transacción de confirmación automática autónoma .

El disparador siempre es parte de la transacción para la acción que dispara el disparador. Si se produce un error en el disparador que causa la reversión de la transacción, la acción de disparo también se revertirá.

Los activadores implícitamente se han activado XACT_ABORT. Un error con esta configuración activará automáticamente la reversión de la transacción (a excepción de los errores generados en el código con la RAISERRORdeclaración).

Martin Smith
fuente