在数据库中的所有行上调用触发器

时间:2011-06-17 19:54:34

标签: sql tsql

我编写了一个触发器,我想用它来将日期添加到记录中的列中,以便我可以跟踪项目的插入。

有大量的插入被调用(大约20000),我注意到每次添加新项时触发器都会更新与每个项关联的所有InsertDate列。如何确保只插入一次的项目。

我的触发器如下:

 SET ANSI_NULLS ON
 SET QUOTED_INDENTIFIER ON
 GO


 CREATE TRIGGER [InsertDate_Item]
    ON [dbo].[ItemHolder]
    AFTER INSERT
    NOT FOR REPLICATION
 AS
 UPDATE ItemHolder SET InsertDate = GETDATE()

非常感谢任何帮助。

由于

5 个答案:

答案 0 :(得分:7)

您需要使用虚拟触发器表INSERTED

将行限制为插入的行
 CREATE TRIGGER [InsertDate_Item]
    ON [dbo].[ItemHolder]
    AFTER INSERT
    NOT FOR REPLICATION
 AS
 SET NOCOUNT ON
 UPDATE IH
 SET InsertDate = GETDATE()
 FROM
    ItemHolder IH
    JOIN
    INSERTED INS ON IH.keycol = INS.keycol
 Go

有一件事:你最好在表格中添加默认值。无需触发器

ALTER TABLE ItemHolder ADD
CONSTRAINT DF_ItemHolder_InsertDate DEFAULT (GETDATE()) FOR InsertDate

答案 1 :(得分:4)

如果要将记录插入表中,为什么不使InsertDate字段具有默认值GetDate()?这完全避免了触发器。

答案 2 :(得分:2)

我会在没有触发器的情况下尝试做什么。只需将列的默认值设置为GetDate()。

答案 3 :(得分:0)

更新ih 设置ih.insertdate = GetDate() 从项目持有人ih内部联接插入i 在ih.itemholderid = i.itemholderid

答案 4 :(得分:-1)

变化:

UPDATE ItemHolder SET InsertDate = GETDATE()

为:

UPDATE ItemHolder SET InsertDate = GETDATE() WHERE InsertDate IS NULL

如果它是null并且您仍然想要使用触发器,则上面只会设置InsertDate。当然,这是假设InsertDate的默认值为null。如果不是这种情况,请告诉我。