尝试捕获更新单个记录中特定字段的日期和时间

时间:2015-05-21 14:06:23

标签: sql sql-server-2008

我必须将字段Comments和Comments DateTime添加到表中。用户将发表评论,完成后,评论数据时间应该捕获更新评论字段的日期和时间。我已经看到许多示例跟踪整个记录何时更新日期时间字段,但是我希望仅在特定评论字段更新该记录时才捕获日期时间。我该怎么做呢?非常感谢任何建议。

修改在关键字' FROM'

附近获取错误的语法
CREATE TRIGGER dbo.updateComments 
ON  dbo.tbl_location_history 
/*Check whether column comments has been updated. If column comments has
been changed, update column comments_datetime with getdate().*/
FOR INSERT,UPDATE AS 
/*Use IF (COLUMNS_UPDATED() &7) = 7 to see whether column 7 was updated.*/
/*Checking out IF UPDATE(comments) for proper time stamp */
IF UPDATE(comments)
BEGIN
SET NOCOUNT ON;
UPDATE dbo.tbl_location_history
SET dbo.tbl_location_history.comments_datetime = GETDATE();
FROM table dbo.tbl_location_history INNER JOIN 
inserted i ON dbo.tbl_location_history.location_id = i.id
END

4 个答案:

答案 0 :(得分:2)

我会在sql server上创建一个触发器。在该触发器测试中,如果注释与旧记录不同。您可以使用触发器中的代码在任意位置记录活动。

答案 1 :(得分:2)

如果您想要仅跟踪评论字段的更新时间,您可以在更新触发器中使用COLUMNS_UPDATED()函数。它可用于跟踪列1,4和6是否已更新,或者它是否可以跟踪是否仅更新了第10列。放入触发器的代码如下所示:

IF CAST(SUBSTRING(COLUMNS_UPDATED(),1,1) AS INT) = 0)
BEGIN
    --do something here
END

这有点令人困惑,但它基本上会检查哪些列已更新并使用二进制(我认为)来表示实际更改了哪些列。请仔细阅读此MSDN文章,如果您有具体问题,请与我们联系。

https://msdn.microsoft.com/en-us/library/ms186329.aspx

答案 2 :(得分:2)

在您自己的架构中跟踪这些更改的替代方法是配置数据库以便为您执行此操作。从SQL Server 2008开始,您可以enable change tracking at the database level。更改跟踪就像一个索引,它由SQL Server透明地维护。在桌面上启用后,可以使用各种change tracking functions来检查更改内容和时间。

答案 3 :(得分:0)

GOT IT!首先,谢谢你们在这里发布的所有人。你是一个惊人的帮助,指导我朝着正确的方向前进。查看代码,看到我的错误(晚安的睡眠确实奇迹)。这是解决方案:

CREATE TRIGGER dbo.updateComments 
ON  dbo.tbl_location_history 
/*Check whether column comments has been updated. If column comments has
been changed, update column comments_datetime with getdate().*/
FOR INSERT,UPDATE AS 

/*Use IF (COLUMNS_UPDATED() &7) = 7 to see whether column 7 was updated.*/
/*Checking out IF UPDATE(comments) for proper time stamp */
IF UPDATE(comments)
BEGIN
SET NOCOUNT ON;
UPDATE dbo.tbl_location_history
SET dbo.tbl_location_history.comments_datetime = GETDATE()
FROM dbo.tbl_location_history INNER JOIN inserted i ON dbo.tbl_location_history.location_id = i.location_id
END