我编写了一个触发器,我想用它来将日期添加到记录中的列中,以便我可以跟踪项目的插入。
有大量的插入被调用(大约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()
非常感谢任何帮助。
由于
答案 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。如果不是这种情况,请告诉我。