【问题标题】:SQL 2005 Trigger Not Firing ReliablySQL 2005 触发器无法可靠触发
【发布时间】:2009-09-23 06:08:09
【问题描述】:
我目前正在使用 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;
【问题讨论】:
标签:
.net
sql-server
database
stored-procedures
triggers
【解决方案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】:
触发器没有明显的问题 - 但您收到这些错误的事实表明,在某些情况下,[inserted].[DataDate] 和 [dbo].[MyTable].[DataDate] 之间的连接失败,或者在插入时触发器被禁用.
这是一个简单的例子来说明您的问题吗?如果没有,您真的不需要触发器来设置CreationDate - 为什么不在列上使用默认值?
ALTER TABLE dbo.MyTable ADD CONSTRAINT Df_MyTable_CreationDate DEFAULT GETUTCDATE() FOR CreationDate
(别忘了放下扳机)
【解决方案3】:
嵌套触发器和/或递归触发器设置可能会阻止触发器触发。触发器也可能被禁用甚至删除/重新创建。