2010-07-11 5 views
1

J'ai un déclencheur récursif, qui semble faire exactement ce que je veux sans récursivité, mais quand je tourne récursif j'obtiens l'erreur: "Maximum stocké procédure, fonction, déclencheur, ou le niveau d'imbrication de la vue est dépassé (limite 32) "comment déboguer un déclencheur récursif

Cela ne devrait pas arriver, car j'imagine 2 ou peut-être 3 niveaux d'imbrication, donc j'ai besoin de déboguer le trigger et de déterminer ce qui se passe exactement. J'ai ajouté une instruction d'impression, mais cela ne fonctionne pas ...

Comment allez-vous déboguer un déclencheur récursif?

ALTER TRIGGER [dbo].[DataInstance2_Trigger] 
    ON [dbo].[DataInstance] 
AFTER UPDATE 
AS 
BEGIN 
    UPDATE DataInstance 
    SET 
    DataInstance.IsCurrent = i.IsCurrent 
    FROM DataInstance di 
    Inner join DataContainer dc on 
     di.DataContainerId = dc.DataContainerId 
    Inner join Inserted i on 
     dc.ParentDataContainerId = i.DataContainerId  
    WHERE di.IsCurrent != i.IsCurrent  

    declare @x int 
    SET @X = (select max(DataContainerId) from Inserted) 
    print @X 

END 

Répondre

3

Vous pouvez inclure une instruction SELECT dans votre déclencheur (je l'ai juste essayé cela - essayer SELECT * FROM DataInstance avant la mise à jour dans le déclencheur).

J'ai repro'ed le problème - le UPDATE dans le déclencheur provoque le déclenchement du déclencheur à nouveau même si il n'y a aucune ligne mise à jour. Une solution appropriée consisterait à placer l'instruction UPDATE dans le déclencheur dans un bloc IF (SELECT COUNT(*) FROM INSERTED) <> 0 BEGIN ... END.

+0

doux, oui, c'était le problème! –