【问题标题】:Trigger Record Comparison触发记录比较
【发布时间】:2014-04-11 14:03:44
【问题描述】:

我正在研究一个过程,当表中记录的版本发生更改时,该过程将创建一个历史表。我的触发器在下面。它正在工作,但无论值是否不同,它都会在每次更新时更新历史表。如果 ProductVersion 不同,我只想写入历史记录表。

任何帮助都会很棒。

 CREATE TRIGGER UpdateServerControlSqlVersionHistory ON [monitor].[ServerControl]
AFTER UPDATE
 AS

 BEGIN
SET NOCOUNT ON;

INSERT INTO monitor.ServerSqlVersionHistory
SELECT i.ServerControlID, i.SqlLinkedServerName, i.ProductVersion, d.ProductVersion, GETDATE()
FROM INSERTED i
    FULL OUTER JOIN DELETED d
        ON i.ServerControlID = d.ServerControlID
END
GO

【问题讨论】:

  • AND i.ProductVersion <> d.ProductVersion?
  • 试过了,现在每次更新我都会得到两条记录。

标签: sql sql-server tsql triggers


【解决方案1】:

很难确定,因为我们不确切知道您在做什么更新,但请尝试 将该条件添加到联接中,并将联接从 FULL OUTER 切换:

CREATE TRIGGER UpdateServerControlSqlVersionHistory ON [monitor].[ServerControl]
AFTER UPDATE
 AS

 BEGIN
SET NOCOUNT ON;

INSERT INTO monitor.ServerSqlVersionHistory
SELECT i.ServerControlID, i.SqlLinkedServerName, i.ProductVersion, d.ProductVersion, GETDATE()
FROM INSERTED i
    JOIN DELETED d
        ON i.ServerControlID = d.ServerControlID
        AND i.ProductVersion <> d.ProductVersion
END
GO

【讨论】:

  • 如果已有记录,此方法有效。如果什么都不存在,则不插入任何记录。
  • @user761786:它是一个CREATE ... AFTER UDPATE 触发器。为此,您需要一个 INSERT 触发器。
  • 是的,这是我添加逻辑以检查插入和更新的下一步。我使用输出数据的第一个触发器。
  • 但关键是你不会记录插入(即“如果什么都不存在”),直到你有一个触发器。如果此触发器正在记录更新,那么它就完成了。
  • 是的,但我不想要两个触发器。我将在插入和更新之后更改我当前的触发器。然后添加关于做什么的逻辑。或者至少我会尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
相关资源
最近更新 更多