我目前正在使用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;
答案 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)
嵌套触发器和/或递归触发器设置可能会阻止触发器触发。也可以禁用触发器,甚至删除/重新创建触发器。