SQL Server更新触发器执行两次

时间:2014-02-17 23:40:47

标签: sql sql-server

我有以下触发器 -

USE [DatabaseA]
GO
/****** Object:  Trigger [dbo].[T_TableA_U]    Script Date: 02/17/2014 18:08:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[T_TableA_U]
on [dbo].[TableA]
after update
as
    set nocount on
    DECLARE @HistoryType    char(1) --"I"=insert, "U"=update, "D"=delete
    DECLARE @RevisionID INT
    SET @HistoryType = 'U'
    SET @RevisionID = 0


    INSERT INTO [DatabaseB].[dbo].[TableA]
            (column1_revtm, column2_revtype,
            column3_id, column4_revid, column5_type, ....)
        SELECT
            GETDATE(), @HistoryType,
            a.column1_id, @RevisionID, a.column2, ....
            FROM TableA a
            inner join inserted i on a.column1_id = i.column1_id

如果我手动更新SOURCE中的一行,它会在DESTINATION中创建一个新行。这很好。

当我使用第三方应用程序时,我正在构建此触发器,但是它在DESTINATION中生成了重复的行。所有数据都完全相同,除了GETDATE(),它告诉我它以某种方式重复了应用程序强制的结果。

那么我该如何解决这个问题呢?有没有办法在INSERT在此触发器中发生之前强制执行DISTINCT,或者我是否可以在DESTINATION表上创建另一个触发器,该触发器表示该行是否重复,然后只插入其中的1个?

1 个答案:

答案 0 :(得分:2)

我发现问题与遗留应用程序的设计方式有关。我有这个触发器的表有一个PK / FK匹配到另一个表。我将触发器反转为使用FK运行表,并且它以1对1的方式工作,没有重复,因此即使只有1个表更新,遗留应用程序似乎也会更新两个表。