2009-09-23 38 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

嵌套触发器和或递归触发设置可能会阻止触发形式射击。此外,触发器可能被禁用,甚至丢弃/重新创建。