2011-06-17 31 views
4

我寫了一個觸發器,我想用它將日期添加到記錄中的某列,以便可以跟蹤該項目的插入。在數據庫中的所有行上調用觸發器

有大量的插入被調用(大約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() 

任何幫助將非常感激。

感謝

回答

7

您需要限制行的插入......利用插入

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 
+0

1爲建議在更好的方式,和固定原始的方式:)完整的示例代碼。 – RThomas

+0

感謝您的回答。我可以使用插入的默認值,但是我可以將您的答案用於我計劃加入每個項目的LastUpdated列。再次感謝 – rinnanstimpy

2

我會在沒有觸發器的情況下去做你想做的事情。只需將列的默認值設置爲GetDate()。

4

如果您將記錄插入表中,爲什麼不讓InsertDate字段具有GetDate()的默認值?這完全避免了觸發器。

+0

+1打我7秒 – RThomas

-1

變化:

UPDATE ItemHolder SET InsertDate = GETDATE() 

到:

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

以上將只設置InsertDate如果是空,你仍然要使用的觸發器。當然,這是假定InsertDate的默認值爲空。如果情況並非如此,請告訴我。

+1

沒有理由擊中表中的每個記錄(也不查詢空值)。正如gbn指出的那樣......插入的虛擬表允許更新限制爲僅受影響的行。 – RThomas

+0

我在我的時候沒有看到他的帖子。我只是在提出一個建議,除非我確信它的優點,否則我將不會提供答案。 – TonsOfFun111

+0

歡迎來到堆棧交換:)...每個人都是批評家:0 – RThomas

0

更新IH 組ih.insertdate = GETDATE()從itemholder IH內連接插入的I 上ih.itemholderid = i.itemholderid

相關問題