2009-09-23 64 views
0

我目前正在使用Microsoft Sync Framework,並且除了有時不會觸發的SQL觸發器外,一切工作正常。這是由框架生成的觸發器代碼。它在90%的時間內工作,但偶爾在插入後CreationDate爲NULL。我可以忽略一些日期問題嗎?SQL 2005觸發器不會觸發可靠

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[MyTable_InsertTrigger] 
    ON [dbo].[MyTable] 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON 
    UPDATE [dbo].[MyTable] 
    SET [CreationDate] = GETUTCDATE() 
    FROM inserted 
    WHERE inserted.[DataDate] = [dbo].[MyTable].[DataDate] 
END; 

回答

1

我建議稍微增強:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[MyTable_InsertTrigger] 
    ON [dbo].[MyTable] 
    AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON 
    UPDATE [dbo].[MyTable] 
    SET [CreationDate] = GETUTCDATE() 
    FROM inserted, MyTable 
    WHERE inserted.[DataDate] = [dbo].[MyTable].[DataDate] 
END; 

這是因爲你可以在插入虛擬表有一個以上的行,爲此它必須被連接到你的表[MyTable的]正確;並使用一個唯一的鍵來加入,所以看看比[DataDate]更好的選擇(假設這是[datetime]類型)。

好運與和平

1

沒有什麼明顯的錯誤與扳機 - 但你得到這些錯誤的事實表明,在某些情況下,[inserted].[DataDate][dbo].[MyTable].[DataDate]之間失敗時,插入發生加入,或觸發禁止。

這是一個簡化的例子來說明你的問題?如果沒有,您不需要觸發器來設置CreationDate - 爲什麼不在列上使用默認值?

ALTER TABLE dbo.MyTable ADD CONSTRAINT Df_MyTable_CreationDate DEFAULT GETUTCDATE() FOR CreationDate 

(不要忘了刪除觸發器)

+2

另一個理由不使用日期作爲主鍵... – 2009-09-23 14:09:04

0

嵌套觸發器和或遞歸觸發設置可能會阻止觸發形式射擊。此外,觸發器可能被禁用,甚至丟棄/重新創建。