如何在 SQL Server 2008 R2 表中添加“上次更新”列?

Posted

技术标签:

【中文标题】如何在 SQL Server 2008 R2 表中添加“上次更新”列?【英文标题】:How do I add a "last updated" column in a SQL Server 2008 R2 table? 【发布时间】:2011-11-13 00:56:17 【问题描述】:

我的 SQL Server 2008 R2 数据库中有一个表,我想添加一个名为 LastUpdated 的列,每次更新行时都会自动更改该列。这样,我就可以看到每一行的最后更新时间。

SQL Server 2008 R2 似乎没有像早期版本那样处理这种情况的数据类型,所以我不确定最好的方法。我想知道使用触发器,但是当触发器更新行时会发生什么?这会再次触发触发器等吗?

【问题讨论】:

你在想timestamp吗?这与日期/时间无关,现在称为rowversion 什么数据类型在早期版本中处理了这个问题?如果您正在考虑 TIMESTAMPROWVERSION,那您就错了 - 此列不包含日期/时间信息,不能用于确定“上次更新”... 我在考虑时间戳/行版本,我认为这与我发布时的日期有关。从那以后我发现它从来都不是! 【参考方案1】:

要知道最后更新了哪一行,您需要创建一个DATETIME/DATETIME2 类型的新列,并使用触发器对其进行更新。没有一种数据类型会在每次更新行时自动使用日期/时间信息进行自我更新。

为避免递归,您可以在触发器中使用UPDATE() 子句,例如

ALTER TRIGGER dbo.SetLastUpdatedBusiness 
ON dbo.Businesses 
AFTER UPDATE -- not insert!
AS
BEGIN
    IF NOT UPDATE(LastUpdated)
    BEGIN
        UPDATE t
            SET t.LastUpdated = CURRENT_TIMESTAMP -- not dbo.LastUpdated!
            FROM dbo.Businesses AS t -- not b!
            INNER JOIN inserted AS i 
            ON t.ID = i.ID;
    END
END
GO

在现代版本中,您可以使用临时表欺骗 SQL Server:

Maintaining LastModified Without Triggers

但这充满了警告和限制,实际上只是在忽略其他多个类似的帖子:

A System-Maintained LastModifiedDate Column Tracking Row Changes With Temporal Columns How to add “created” and “updated” timestamps without triggers Need a datetime column that automatically updates

【讨论】:

不是我!即使我有足够的分数,我也不会对这些答案中的任何一个投反对票,因为它们都非常有帮助。我要试试这个,然后报告我的进展情况。 再次返回...刚刚尝试过,但没有成功。我有一个名为 Businesses 的表,其中有一个名为 LastUpdated 的 DateTime 字段,这是我希望在每次行更改时更新的字段。我添加了以下触发器,但是当我更新其中一行时 LastUpdated 字段没有改变。我做错了什么?再次感谢。插入后在企业上创建触发器 SetLastUpdatedBusiness 好像不是 UPDATE(LastUpdated) 开始更新 t 设置 dbo.LastUpdated=CURRENT_TIMESTAMP 从企业作为 b 内部连接插入为 i 在 b.ID=i.ID 结束去 你更新了哪一栏?你能把你的触发器和更新语句作为代码示例放在你的问题中,这样它就可以阅读了吗?为什么你的专栏引用dbo.LastUpdated?那不是专栏。 您的触发器也显示AFTER INSERT ...我认为您的意思是AFTER UPDATE。您还需要别名来匹配,您不能说UPDATE t 然后引用Businesses as b - 您需要更改其中一个。请查看更新后的示例。 啊,谢谢亚伦。我在插入时创建了触发器(呃!)而不是更新。我猜错误的别名没有帮助!现在一切正常。【参考方案2】:

不幸的是,这并不容易。

您可以将新的DATETIME(或DATETIME2)字段添加到您的表中,并且可以给它一个默认约束GETDATE() - 这将在插入新行时设置值。

不幸的是,除了创建AFTER UPDATE 触发器之外,没有“开箱即用”的方式来让它一直保持更新。触发器本身并不难编写,但是您必须为每个应该具有该功能的表编写它.....

【讨论】:

我想说一个触发器可以作为一种自动更新的方式。没有解决问题的无限触发递归部分。 @Will Den:是的,它是自动的——一旦你写了它并把它放好。我一直希望微软可能会引入类似于timestamp/rowversion 列的东西,这些列由 SQL Server 本身自动更新——但基于人类可读的日期/时间格式。还没有这样的运气(SQL Server“Denali”似乎也没有这样的东西:-()

以上是关于如何在 SQL Server 2008 R2 表中添加“上次更新”列?的主要内容,如果未能解决你的问题,请参考以下文章

我如何修改我的 Sql server 2008 r2 FK 的父表

如何删除 SQL Server 2008 R2 数据库中的最后 N 条记录? [复制]

SQL Server 2008 R2列属性修改

SQL Server 2008 R2,查询在 65536 行后退出

在 SQL Server 2008 R2 事务复制中筛选列数据

如何安装sql server 2008 r2