表格的“时间戳”?

时间:2014-01-06 16:43:21

标签: sql-server sql-server-2008

我知道您可以为列设置timestamp / rowversion种类型。

表是否有类似的属性/字段/机制,可以告诉我是否修改了表行(例如,行/已插入/已删除/已更新)?

我可以读取表模式,但是我看不到任何显示此类信息的列(例如,如果我打开带有ADO的表模式 - DATE_MODIFIED总是为空 - 我也确定它指的是表结构,而不是行数据。)

我正在考虑创建自己的“应用程序”表,我将在其中存储这些信息,这些信息将通过在我需要检查的表中创建触发器来收集。但是,如果已经存在这个问题的工作模式,这似乎需要付出很多努力。

感谢。

1 个答案:

答案 0 :(得分:3)

您是正确的,表示没有适用于表格的timestamp / rowversion

您可以按照建议创建修改表。您可以使用触发器捕获任何INSERT / UPDATE / DELETE语句,并插入修改的日期/时间。但是,此日期/时间不会告诉您更改 - 只有某些内容已更改。这个限制对你来说是可以接受的。

如果您需要了解有关更改内容的更多信息,可以在每条记录上使用timestamp或修改日期列。让应用程序代码记录上次已知的最大时间戳或更改日期。然后,查询已更改的记录变得很容易。这也应该不需要单独的表来跟踪修改日期。

不幸的是,您无法确切地确定以这种方式删除了哪些行。如果您还需要跟踪已删除的行,则可能需要使用DELETE触发器将其记录在表格中。

- 编辑 -

Microsoft从SQL Server 2008开始添加了change tracking and change data capture。我从未使用过此功能,因此我没有任何建议。但是,该功能在SQL Server Standard Edition中可用,因此您无需购买企业版即可获取该功能。

要使用更改跟踪,请先配置数据库以使用更改跟踪:

ALTER DATABASE MyDatabase SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 14 DAYS)

接下来,配置要跟踪的表:

ALTER TABLE MyTable ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON)

要获取最新版本,请使用CHANGE_TRACKING_CURRENT_VERSION

DECLARE @version BIGINT
SET @version = CHANGE_TRACKING_CURRENT_VERSION();

SELECT * FROM MyTable

要获取自上一版本以来的更改,请使用CHANGETABLE function。使用LEFT JOIN可确保查询返回有关已删除行的信息:

SELECT *
FROM CHANGETABLE(CHANGES MyTable, @version) C
LEFT JOIN MyTable T
    ON T.ID = C.ID

请注意,Microsoft建议使用快照隔离:

  

选择适用于您的应用程序的方法   使用更改跟踪(或任何自定义跟踪机制),需要   重要的分析。因此,使用快照要简单得多   隔离。