我有以下触发器 -
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个?
答案 0 :(得分:2)
我发现问题与遗留应用程序的设计方式有关。我有这个触发器的表有一个PK / FK匹配到另一个表。我将触发器反转为使用FK运行表,并且它以1对1的方式工作,没有重复,因此即使只有1个表更新,遗留应用程序似乎也会更新两个表。