SQL 2005触发器无法可靠地触发

时间:2009-09-23 06:08:09

标签: .net sql-server database stored-procedures triggers

我目前正在使用Microsoft Sync Framework,除了有时似乎没有触发的SQL触发器外,一切正常。这是框架生成的触发器代码。它有90%的工作时间,但插入后偶尔CreationDate为NULL。我可以忽略一些日期问题吗?

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;

3 个答案:

答案 0 :(得分:1)

触发器没有明显的错误 - 但是你得到这些错误的事实表明,在某些情况下,[inserted].[DataDate][dbo].[MyTable].[DataDate]之间的连接失败,或者触发器被禁用时插入发生。

这是一个简化的例子来说明你的问题吗?如果没有,您实际上不需要触发器来设置CreationDate - 为什么不在列上使用默认值?

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

(别忘了放下扳机)

答案 1 :(得分: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;

这是因为您可以在虚拟表INSERTED中拥有多行,因此必须正确连接到您的表[MyTable];并使用唯一键加入,所以看看比[DataDate]更好的选择(假设这是[datetime]类型)。

祝你好运和平安

答案 2 :(得分:0)

嵌套触发器和/或递归触发器设置可能会阻止触发器触发。也可以禁用触发器,甚至删除/重新创建触发器。