2010-07-11 4 views
1

잠재적으로 스스로를 호출 할 수있는 업데이트 트리거를 작성했습니다 (이는 원하는 동작 임).재귀 트리거를 작성하는 방법

불행히도 트리거는 자체를 호출하지 않으며 이유를 볼 수 없습니다. 이 트리거는 단순히 상위 키를 기반으로하는 하위 레코드의 값을 변경하는 것입니다. 그런 다음 업데이트되는 해당 자식에 대해 트리거가 다시 발생해야하며 해당 자식에 대한 하위 레코드가 업데이트되어야한다고 기대합니다.

트리거가 성공적으로 완료되고 자식 레코드가 예상대로 설정되는 동일한 업데이트를 수동으로 실행할 수 있습니다.

내가 EXEC sp_configure를 '중첩 트리거'를 실행하고 그

최소 돌아왔다 : 0, 최대 : 1, config_value : 1, run_value : 1, 그래서 재귀가 켜져있는 것 같다.

ALTER TRIGGER [dbo].[DataInstance_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    

END 
+0

'재귀 반환 triggers'' : 디버깅을위한

insert into dbo.LogTable (txt) values ('Updated ' + cast(IsNull(@@ROWCOUNT,-1) as varchar(25)) + ' rows.') 

을, 당신은 또한 인쇄를 사용할 수 있습니까? –

답변

4

외에도 서버 전체 설정에서, 당신은 또한 데이터베이스 당 트리거를 비활성화 할 수 있습니다

ALTER DATABASE databasename SET RECURSIVE_TRIGGERS ON | OFF 

또는 데이터베이스 속성을 통해

-> 옵션 -> 기타이 -> 재귀 트리거 사용.

체크 아웃 한 경우 첫 번째 트리거가 실제로 무언가를 업데이트하는지 확인하십시오. 나는 보통 로그 테이블을 사용

`EXEC sp_dboption에 '데이터베이스 이름', 무엇을
print 'Updated ' + cast(IsNull(@@ROWCOUNT,-1) as varchar(25)) + ' rows.' 
+0

신난다, 여러 백서를 읽었으며 데이터베이스 당 켜는 것에 대한 참조를 보지 못했습니다! 이제 오류가 발생합니다 : 최대 저장 프로 시저, 함수, 트리거 또는보기 중첩 수준이 초과되었습니다 (제한 32). 도전적으로 맞지 않지만 진전이있었습니다. –

관련 문제