2011-05-09 6 views
1

업데이트 할 트리거를 작성 했으므로 업데이트가 발생할 때마다 트리거가 실행됩니다. 하지만 내 업데이트 진술 중 하나에 대해서는 트리거가 발생하지 않기를 바랍니다. 트리거를 일시적으로 사용 중지하려면 어떻게해야합니까?일부 상황에서 업데이트 트리거 비활성화

답변

0

사용하지 않도록 트리거 문 다음은

DISABLE TRIGGER Person.uAddress ON Person.Address; 
update .... 
ENABLE Trigger Person.uAddress ON Person.Address; 
+2

제 생각에 'disable trigger'는 동시에 실행될 경우 다른 업데이트에도 영향을 미칩니다. 이걸 테이블 자물쇠로 감싸 야합니다. – Andomar

0

당신은 테이블과 트리거를 변경해야합니다 다음과 같이 업데이트를 수행함. 가능한 해결책 중 하나는 테이블에 열을 추가하는 것입니다 (예 : 트리거 됨). "정상적인"업데이트를 만들 때 1을 삽입해야합니다. 업데이트를 피하려면 트리거 된 = 0이 필요합니다. 트리거 코드가 있어야한다 :

IF EXISTS(SELECT * FROM INSERTED WHERE triggered=1) 
--here you trigger fired 
4

MSDN은 하나의 세션에 대해 use CONTEXT_INFO to disable a trigger하는 방법의 예를 가지고있다.

Dalex의 대답에 유사
+0

Yikes! ................. –

+0

동일한 연결에서 여러 업데이트를 시작하면 모든 연결이 트리거되거나 피하십시오. – Dalex

+1

@Dalex :이 캐쉬에서 이탈시 CONTEXT_INFO 트리거를 재설정해야합니다. – gbn

0

:

또 다른 해결책은 Triggered처럼 열을 추가하는 것입니다. 그리고 당신의 방아쇠에 이것을 사용하십시오.

IF NOT UPDATE(Triggered) 
BEGIN 
    RETURN; 
END 

UPDATE()

단순히 열이 트리거에 포함 된, 값이 실제로 변경된 여부 아닌지를 확인. 트리거를 실행하려는 모든 쿼리에 Triggered = 1이 있으면 트리거됩니다. 이 쿼리가없는 쿼리는 트리거를 실행하지 않습니다.

nvarchar 열을 사용하고 이유 필드를 플래그와 설명으로 사용할 수 있습니다. 트리거가 발생하지 않습니다 TUS

UPDATE Users 
    SET Password = ..encrypted_password.., 
     Reason = 'changed password' 
WHERE UserID = ... 

다음

IF NOT UPDATE(Reason) 
BEGIN 
    RETURN; 
END 

알의 사용자가 로그인시가 lastlogin 필드를 업데이트하는 경우, 당신은 이유를 제외 할 수 있습니다.

UPDATE Users 
    SET LastLogin = getDate() 
WHERE UserID = ... 
관련 문제