2013-11-20 12 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'  

我的問題是:是否更新語句做到這一點只有在插入的行設置ID_WEEK爲0;如果FREQ =「日報」的工作?還是它會循環整個桌子?因爲現在只有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 

或者:

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 

但是這將是更容易只是創建了ID_WEEK列的默認約束。