如果新字段值!=旧字段值,则触发更新时间戳

时间:2014-01-16 17:10:54

标签: sql sql-server-2008 triggers

我正在尝试使用时间戳更新名为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

1 个答案:

答案 0 :(得分:0)

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

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将导致触发器触发并处理所有受影响的行。