2009-11-06 8 views
1

Si je déclenche une erreur dans un déclencheur AFTER UPDATE dans Sql Server 2005, cela provoquera-t-il la mise à jour qui a déclenché le déclenchement du déclencheur, même si l'instruction n'a pas été exécutée dans une transaction?Raising errors in After Triggers Sql Server 2005

Merci.

Répondre

4

Non, vous devez rollback transaction en appelant ROLLBACK TRAN:

CREATE TRIGGER trg_au_table 
ON dbo.table 
AFTER UPDATE 
AS 
BEGIN 
    ROLLBACK TRAN 
END 
GO 

Cet exemple empêchera de mettre à jour aucune notice.

Ce:

CREATE TRIGGER trg_au_table 
ON dbo.table 
AFTER UPDATE 
AS 
BEGIN 
    RAISERROR('This is a test', 16, 1) 
END 
GO 

ne fera que soulever l'erreur mais le changement sera fait dans le tableau.

+0

Donc, y a-t-il une transaction implicite? Si je n'ai pas commencé une transaction explicitement, ROLLBACK TRAN causera-t-il des problèmes? Merci! – Jordan

+0

Oui, il y a une transaction implicite. La mise à jour et le déclenchement sont fermés en une transaction. Trigger est toujours en une transaction avec une instruction DML ou DDL. Si vous effectuez une mise à jour, vous devez attendre que les instructions du déclencheur soient terminées. RAISERROR ne supprime pas la transaction. –

+0

Notez que toute instruction de restauration (sans répertorier de point de sauvegarde) annulera toutes les transactions ouvertes existantes. [Lien] (http://stackoverflow.com/a/11469663). – crokusek