2013-11-20 20 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列的默认约束。