【问题标题】:SQL Server 2016 Update a datetime attribute for a row in a table when a change occurs in that rowSQL Server 2016 在表中的行发生更改时更新该行的日期时间属性
【发布时间】:2020-07-23 03:05:32
【问题描述】:

基本上我有一个包含三列的表:Data, DatetimeCreated, DatetimeModified

只要该行的Data 属性发生更改,我就需要使用GETDATE() 更新DatetimeModified 属性。

如何使用UPDATE 触发器完成此操作?任何帮助表示赞赏。

我在 Windows 10 上使用 SQL Server 2016

【问题讨论】:

    标签: sql sql-server tsql triggers


    【解决方案1】:

    您还需要一个 主键 列在您的表中才能正常工作 - 任何严肃的表都应该有它......

    那么你可以使用这个:

    CREATE TRIGGER trgUpdateDatetimeModified
    ON dbo.YourTableNameHere
    AFTER UPDATE
    AS
    BEGIN
        UPDATE dbo.YourTableNameHere
        SET DatetimeModified = SYSDATETIME()
        FROM Inserted i
        INNER JOIN Deleted d ON d.PrimaryKey = i.PrimaryKey
        WHERE d.Data <> i.Data;
    END;
    

    基于触发器内可用的DeletedUPDATE 之前的旧值)和InsertedUPDATE 之后的新值)伪表,它检查Data 中的哪些行有更新列,对于那些,DatetimeModified 已更新。

    我还建议您开始使用 SYSDATETIME() 而不是 GETDATE() 作为最佳做法。

    【讨论】:

    • 使用 'WHERE d.Data i.Data' 不起作用。我对“WHERE d.id = MyTable.id”进行了更改,得到了我想要的结果。
    • @StanB13:您的Data 列是什么数据类型
    • @StanB13:按照您的方式进行操作只会更新所有已更新的行 - 无论(已)更新了哪些列。但这通常也是您想要的行为,对吧?
    • 数据列的类型为 varchar(15)。表中还有其他列可以更新,所以是的,这就是我正在寻找的。如果我包含了其他列,我想您会选择它。无论哪种方式,您都极大地帮助了我,非常感谢。谢谢。
    • 顺便说一句,现在知道我可以根据给定列中的更改更新修改日期是一个奖励。再次感谢!!
    猜你喜欢
    • 2018-08-30
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多