SQL Server更新/修改日期字段

SQL Server更新/修改日期字段,sql,sql-server,triggers,Sql,Sql Server,Triggers,我正在使用以下触发器跟踪表中上次修改的日期: CREATE TRIGGER trg_UpdateTimeEntry ON dbo.TimeEntry AFTER UPDATE AS UPDATE dbo.TimeEntry SET ModDate = GETDATE() WHERE ID IN (SELECT DISTINCT ID FROM Inserted) 它表示更新后,但即使我插入一行,它也会将ModDate列设置为与输入日期相同。我怎样才能阻止这种事情发生?我

我正在使用以下触发器跟踪表中上次修改的日期:

CREATE TRIGGER trg_UpdateTimeEntry
ON dbo.TimeEntry
AFTER UPDATE
AS
    UPDATE dbo.TimeEntry
    SET ModDate = GETDATE()
    WHERE ID IN (SELECT DISTINCT ID FROM Inserted)
它表示更新后,但即使我插入一行,它也会将ModDate列设置为与输入日期相同。我怎样才能阻止这种事情发生?我只希望它在我有机会更改一行时更改,而不是在添加新行时更改。在这种情况下,它应该保持为NULL

谢谢

CREATE TRIGGER trg_update_my_table on my_table 
FOR UPDATE AS            
BEGIN
    UPDATE my_table
    SET modified_on=getdate()
    FROM my_table INNER JOIN deleted d
    on my_table.id = d.id
END
GO
或者,您可以将现有触发器的定义更改为

CREATE TRIGGER trg_UpdateTimeEntry
ON dbo.TimeEntry
AFTER UPDATE
AS
    UPDATE dbo.TimeEntry
    SET ModDate = GETDATE()
    WHERE ID IN (SELECT DISTINCT ID FROM deleted)

插入的表将包含所有新插入的记录和任何更新记录的新值,删除的表将只包含更新记录的旧值。

为什么不直接在查询中执行此操作。而不是通过触发器来完成这项工作?是否也有可能指定了默认值?Irfan:我不确定我是否遵循,因为这是一个表,我不知道如何进行更新日期。克丽丝:谢谢!!!!就是这样。在这段代码中,您在插入的表中检查ID,该表将具有新插入记录的所有ID或任何更新记录的新值,删除的表将仅具有更新记录的旧值。您还可以更改WHERE语句,例如在SELECT DISTINCT ID FROM deleted中的WHERE ID