【问题标题】: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】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-07
          • 1970-01-01
          • 2013-05-25
          • 2010-09-14
          • 1970-01-01
          • 2018-10-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多