Déclenchement en combinaison avec la transaction

25

Supposons que nous ayons la situation suivante:

Nous avons une table (disons Table_A) qui a un déclencheur INSERT. Le travail de déclenchement consiste à mettre à jour certaines lignes en table_Bfonction des valeurs insérées dans table_A.

Maintenant, tout va bien lorsque nous insérons simplement une ligne dans le tableau, mais qu'en est-il des situations où nous insérons des données via une transaction?. Le déclencheur attendra-t-il que toutes les instructions de transaction s'exécutent correctement, ou il sera déclenché au moment où il reconnaît l'insertion?. Si le déclencheur se déclenche immédiatement lorsqu'il reconnaît la première insertion, que se passera-t-il si la transaction échoue sur la dernière ligne?. Y a-t-il un mécanisme pour cette situation?.

veljasije
la source

Réponses:

37

Un insert est toujours dans une transaction.

Si vous n'avez pas d'explicite BEGIN TRAN ... COMMITou SET IMPLICIT_TRANSACTIONS ONalors l'instruction s'exécute comme une transaction de validation automatique autonome .

Le déclencheur fait toujours partie de la transaction pour l'action qui déclenche le déclencheur. Si une erreur se produit dans le déclencheur qui entraîne l'annulation de la transaction, l'action de lancement sera également annulée.

Les déclencheurs sont implicitement activés XACT_ABORT. Une erreur avec ce paramètre activé entraînera automatiquement la restauration de la transaction (sauf pour les erreurs soulevées dans le code avec l' RAISERRORinstruction).

Martin Smith
la source