2010-07-11 7 views
1

재귀 트리거가 있습니다. 재귀가 필요없는 정확히 수행 할 것으로 보이지만 재귀를 사용할 때 "최대 저장 프로 시저, 함수, 트리거 또는 보기 중첩 수준 초과 (제한 32) "재귀 트리거를 디버깅하는 방법

중첩이 2 또는 3 레벨 일 것으로 예상되므로 이러한 상황이 발생하지 않아야하므로 트리거를 디버그하고 정확히 무슨 일이 일어나는지 알아야합니다. print 문을 추가했지만 작동하지 않습니다 ...

재귀 트리거를 디버깅하는 방법은 무엇입니까?

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 

답변

3

당신은 당신의 트리거에 SELECT 문을 포함 할 수 있습니다 (난 그냥이 시도했습니다 - SELECT * FROM DataInstance 전에 트리거에서 업데이트하려고).

문제가 재현되었습니다. 행이 업데이트되지 않아도 트리거의 업데이트로 인해 트리거가 다시 실행됩니다. 적절한 수정 프로그램은 IF (SELECT COUNT(*) FROM INSERTED) <> 0 BEGIN ... END 블록의 트리거 내에 UPDATE 문을 래핑하는 것입니다.

+0

달콤한, 네, 그게 문제 였어요! –