2013-11-20 1 views
0

궁금합니다. 나는 내가 원하는 것을 정확히하는이 방아쇠를 가지고있다.삽입 트리거 후 SQLServer는 전체 테이블 또는 삽입 된 행을 반복합니다.?

 USE [IGOR] 
     GO 
     /****** Object: Trigger [dbo].[AfterInsertTarget] Script Date: 11/20/2013 14:46:06 ******/ 
     SET ANSI_NULLS ON 
     GO 
     SET QUOTED_IDENTIFIER ON 
     GO 


     ALTER TRIGGER [dbo].[AfterInsertTarget] ON [dbo].[DMM_TARGET] 

     after insert 
     as 
     set nocount on 

     update DMM_TARGET 
     set ID_WEEK = 0 
     WHERE FREQ = 'Daily'  

내 질문은 :합니까 업데이트 문에만 삽입 된 행에 FREQ = '데일리'의 경우 0으로 ID_WEEK를 설정하는 일이다합니까? 또는 전체 표를 물결 모양으로 순환합니까? 왜냐하면 지금은 단지 50000 개의 항목이기 때문입니다. 그러나 수백만에 이르면 트리거만으로 한 행을 삽입하는 데 시간이 걸릴 것입니다.

감사합니다.

+3

트리거는'inserted' 의사 - 테이블을 참조하지 않기 때문에 삽입이 영향을받는 행을 기반으로 업데이트해야하는 행을 식별하지 않습니다. 또한 이것을 "루프"로 생각하지 않아야합니다. 마지막으로, 해당 열에 기본 제약 조건을 추가하지 않으시겠습니까? –

답변

2

트리거 호출과 관련된 레코드 만 포함하는 inserted 의사 테이블과의 상관 관계가 없으므로 트리거는 현재 모든 행을 업데이트합니다.

ALTER TRIGGER [dbo].[AfterInsertTarget] 
ON [dbo].[DMM_TARGET] 
AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE t SET ID_WEEK = 0 
    FROM dbo.DMM_TARGET AS t 
    WHERE EXISTS (SELECT 1 FROM inserted WHERE key = t.key); 
END 
GO 

또는 : 만 새로운 행에 영향을 미치는 것이 바로 ID_WEEK 열에 기본 제약 조건을 만드는 것이 훨씬 쉬울 것이다 그러나

ALTER TRIGGER [dbo].[AfterInsertTarget] 
ON [dbo].[DMM_TARGET] 
AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE t SET ID_WEEK = 0 
    FROM dbo.DMM_TARGET AS t 
    INNER JOIN inserted AS i 
    ON t.key = t.key; 
END 
GO 

.