如何在 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
什么数据类型在早期版本中处理了这个问题?如果您正在考虑 TIMESTAMP
或 ROWVERSION
,那您就错了 - 此列不包含日期/时间信息,不能用于确定“上次更新”...
我在考虑时间戳/行版本,我认为这与我发布时的日期有关。从那以后我发现它从来都不是!
【参考方案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,查询在 65536 行后退出