2014-02-24 3 views
1

특정 삽입 값이있는 경우 테이블을 업데이트하는 테이블에 업데이트 트리거를 만들어야합니다. 이것이 가능한가? 나는 시도한 후 삽입 된 값이 존재하고 트리거를 발생 시키면 트리거는 업데이트를 수행하고 다시 발생합니다. 결국 - 교착 상태. 이것을 안전하게 수행 할 수있는 방법이 있습니까? SQL Server 2008 업데이트 트리거

강령 : 동안이 직접 자신을 트리거에서 데이터베이스의 모든 트리거를 방지 할 수

USE [master] 
GO 
ALTER DATABASE [yourDbName] SET RECURSIVE_TRIGGERS OFF WITH NO_WAIT 
GO 

:

당신이 할 수있는
CREATE TRIGGER dbo.trg_updateaddress on dbo.Customers 
    AFTER UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @original_source varchar(50) 
    SELECT @original_source = address_source FROM deleted 

    IF EXISTS (SELECT * FROM inserted i 
       INNER JOIN deleted d 
        ON i.cust_id = d.cust_id 
       WHERE i.address_source IS NOT NULL 
       AND (i.[address] <> d.[address] 
       OR i.address2 <> d.address2 
       OR i.city <> d.city 
       OR i.[state] <> d.[state] 
       OR i.zip <> d.zip 
       OR i.country <> d.country 
       OR i.phone <> d.phone 
       OR i.cell <> d.cell 
       OR i.email <> d.email)) 
    BEGIN 
     UPDATE customers 
     SET address_changed = GETDATE() 
    END 
    ELSE 
    BEGIN 
     UPDATE customers 
     SET address_source = @original_source 
    END 
END 
+0

에 당신이 할 수 설정 발사 할 경우, 2로 설정 한 번 한 후, 첫 번째 업데이트 1에서 계산 시작 트리거 코드를 보여 주시겠습니까? –

+0

코드 게시 위 –

+0

트리거가 반복적으로 실행 되길 원합니까? 아니면 불필요한가요? – RBarryYoung

답변

1

한 가지는 데이터베이스에 트리거 재귀를 사용하지 않도록하는 것입니다 여전히 다른 트리거를 발사 할 수 있습니다.

일반적으로 재귀 트리거는 일반적으로 원하는 것이 아니며 매우 특수화 된 동작이므로이 설정을 사용하는 것이 좋습니다.

당신은 NESTED_LEVEL

자체에 발사에서 트리거를 방지 할 수 있습니다

+0

이 데이터베이스에는 많은 트리거가 있고 다른 트리거 코드를 손상시킬 가능성이 있으므로 내 환경에서는 이것이 무서울 것입니다. –

1

가 SET NOCOUNT ON 후이를 넣어;

IF trigger_nestlevel() < 2 

이렇게하면 트리거가 자체 업데이트에서 실행되지 않습니다.

참고 : trigger_nestlevel 경우에만 화재로 방아쇠를 원하는 그래서 만약 당신이 두 번 다음 3

+0

+1 : 이것은 아마도 OP에 대한 더 나은 대답 일 것입니다. – RBarryYoung

관련 문제