0

我想知道。我有这个触发器,它完全符合我的要求。

      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 = 'Daily' 仅在插入的行上,更新语句是否可以将 ID_WEEK 设置为 0?还是它循环穿过整个桌子?因为现在它只有 50000 个条目。但如果它达到数百万,仅因为触发器,插入一行将需要一段时间。

4

1 回答 1

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 列上创建默认约束会容易得多。

于 2013-11-20T19:56:41.900 回答