【问题标题】:Trigger to update timestamp if new field value != old field value如果新字段值!= 旧字段值,则触发更新时间戳
【发布时间】:2014-02-05 17:54:30
【问题描述】:

每当其他 2 个字段中的任何一个更改为与原始值不同的值时,我都会尝试使用时间戳更新名为 LastUpdate 的字段。这两列是LoadDateCompleteDate。我拥有的触发器有效,但是由于我每次运行进程时都会更新行,无论日期是否更改,它都会更新时间戳。我需要比较一下旧的LoadDate 是否与新的LoadDate 不同,或者旧的CompleteDate 是否与新的CompleteDate 不同。这是我的触发器:

CREATE TRIGGER time_stamp 
ON my_table
FOR UPDATE, INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    DECLARE @LoadDate datetime, @CompleteDate datetime
    SELECT @LoadDate = LoadDate, @CompleteDate = CompleteDate FROM my_table

    UPDATE my_table 
    SET LastUpdate = GETDATE()
    WHERE LoadDate = @LoadDate
    AND CompleteDate = @CompleteDate 
END

【问题讨论】:

  • inserteddeleted 是表,因此它们可以表示集合操作的结果。假设触发器总是只包含一行,而设计触发器通常是一个糟糕的计划。您可以使用 比较 beforeafter 值并更新正确的行。 This 提供介绍。

标签: sql sql-server-2008 triggers


【解决方案1】:

您的触发器中应该只需要一个语句。应该这样做:

update MT
  set LastUpdate = GetDate()
  from My_Table as MT inner join
    -- Inner join with   inserted   to pick up only those rows inserted or updated.
    inserted as i on i.YourIdColumn = MT.YourIdColumn left outer join
    -- Left outer join with   deleted   to pick up the "before" values if this is an UPDATE.
    deleted as d on d.YourIdColumn = MT.YourIdColumn
  where
    -- LoadDate has changed or this is an INSERT.
    ( i.LoadDate <> d.LoadDate or d.LoadDate is NULL ) or
    -- CompleteDate has changed or this is an INSERT.
    ( i.CompleteDate <> d.CompleteDate or d.CompleteDate is NULL )

请注意,这是执行集合操作。影响多行的 INSERT 或 UPDATE 将导致触发器触发一次并处理所有受影响的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多