我的SQL Server 2008 R2数据库中有一个表,并希望添加一个名为LastUpdated的列,每次更新行时都会自动更改。这样,我可以看到每个行最后一次更新的时间。
似乎SQL Server 2008 R2没有像早期版本那样处理这种数据类型,所以我不确定最好的方法。我想知道使用触发器,但是当触发器更新行时会发生什么?是否会再触发触发器等?
答案 0 :(得分:62)
要知道上次更新了哪一行,您需要创建一个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
答案 1 :(得分:10)
不幸的是,这并不容易。
您可以向表中添加新的DATETIME
(或DATETIME2
)字段,并且可以为其设置默认约束GETDATE()
- 这将设置新行的值插入。
不幸的是,除了创建AFTER UPDATE
触发器之外,没有“开箱即用”的方式来保持它始终更新。触发器本身并不难写,但你必须为每个具有该功能的单个表编写它.......