web-dev-qa-db-fra.com

Déclenchement en combinaison avec la transaction

Supposons que nous ayons la situation suivante:

Nous avons une table (disons Table_A), qui a un déclencheur sur INSERT. Le travail de déclenchement consiste à mettre à jour certaines lignes dans table_B basé sur les 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?.

25
veljasije

Un insert est toujours dans une transaction.

Si vous ne disposez pas d'un BEGIN TRAN ... COMMIT ou SET IMPLICIT_TRANSACTIONS ON alors l'instruction s'exécute en tant que autonome transaction de validation automatique .

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 provoque l'annulation de la transaction, l'action de lancement sera également annulée.

Les déclencheurs ont implicitement XACT_ABORT activé. 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'instruction RAISERROR).

38
Martin Smith