Utilisation de déclencheurs DML contenant des instructions COMMIT ou ROLLBACK TRANSACTION

Dans Microsoft SQL Server 2000 et SQL Server 2005, le comptage des transactions est incrémenté dans une instruction uniquement lorsqu'il est nul au démarrage de l'instruction. Dans SQL Server version 7.0, le comptage des transactions est toujours incrémenté, quelle que soit sa valeur au démarrage de l'instruction. Par conséquent, la valeur retournée par @@TRANCOUNT dans les déclencheurs peut être inférieure dans SQL Server 2000 et SQL Server 2005 par rapport à sa valeur dans SQL Server 7.0.

Dans SQL Server 2000 et SQL Server 2005, si une instruction COMMIT TRANSACTION ou COMMIT WORK est exécutée dans un déclencheur et s'il n'existe pas d'instruction BEGIN TRANSACTION explicite ou implicite correspondante au démarrage du déclencheur, les utilisateurs peuvent constater un comportement différent par rapport à SQL Server version 7.0. Il est déconseillé de placer des instructions COMMIT TRANSACTION ou COMMIT WORK dans un déclencheur.

Lorsque des déclencheurs contenant des instructions COMMIT ou ROLLBACK TRANSACTION sont exécutés à partir d'un lot d'instructions, ils annulent le lot tout entier. Dans SQL Server 2005, une erreur est également retournée.

Dans l'exemple suivant, si l'instruction INSERT active un déclencheur DML contenant une instruction ROLLBACK TRANSACTION, l'instruction DELETE ne s'exécutera pas car le lot d'instructions est annulé.

/* Start of Batch */
INSERT employee VALUES ('XYZ12345M', 'New', 'M', 'Employee', 1, 1, '9952', '6/1/95') -- Causes trigger to fire and ROLLBACK TRANSACTION.
DELETE employee WHERE emp_id = 'PMA42628M'
GO

Si des déclencheurs contenant des instructions ROLLBACK TRANSACTION sont activés à partir d'une transaction définie par l'utilisateur, l'instruction ROLLBACK TRANSACTION restaure toute la transaction. Dans l'exemple suivant, si l'instruction INSERT active un déclencheur contenant une instruction ROLLBACK TRANSACTION, l'instruction UPDATE est également restaurée.

/* Start of Transaction */
BEGIN TRANSACTION
UPDATE employee SET hire_date = '7/1/94' WHERE emp_id = 'VPA30890F'
INSERT employee VALUES ('XYZ12345M', 'New', 'M', 'Employee', 1, 1, '9952', '6/1/95') -- Causes trigger to fire and ROLLBACK TRANSACTION.

Voir aussi

Concepts

Restauration et validation de transactions dans les procédures stockées et les déclencheurs
Transactions (moteur de base de données)

Autres ressources

ROLLBACK TRANSACTION (Transact-SQL)

Aide et Informations

Assistance sur SQL Server 2005