如何跟踪表中数据的变化?

时间:2014-12-31 19:56:36

标签: sql sql-server

我有一个简单的问题。如何跟踪SQL Server表中某行的更改?这是我想要的一个例子。

:用户

:名称|地址|用户名|用户类型

第1行:Christopher | 123假街| Lover1234 | 1

如何跟踪用户将“Christopher”更改为“Robert”的时间,或者他们是否将“123 Fake Street”更改为“124 Fake Street”。我需要知道更改的时间,以及更改的旧值。我还希望能够跟踪UserType是否更改(这是一个外键),所以我需要知道如何跟踪外键更改。

这可能发生在多个不同的表中,我想跟踪多个不同的表。

2 个答案:

答案 0 :(得分:4)

有不同的选项可以做到这一点。我会提到两个:

选项1:

在表中添加一个名为IsHistory的列。你最终会得到这样的东西:

Name        | Address         | Username  | UserType | IsHistory
------------+-----------------+-----------+----------+----------
Christopher | 123 Fake Street | Lover1234 | 1        | 0

然后,当您更新记录时,将旧记录上的IsHistory值更改为1,然后添加包含更新信息的新记录,并将IsHistory记录设置为0.您最终会得到以下内容:

Name        | Address         | Username  | UserType | IsHistory
------------+-----------------+-----------+----------+----------
Christopher | 123 Fake Street | Lover1234 | 1        | 1
Robert      | 123 Fake Street | Lover1234 | 1        | 0

选项2:

添加一个日志表,您可以在其中拥有以下内容:

LogID | Entity | ActionType | Description | OldDataXML

然后,每次更新发生时,在此处插入记录。

  • LogID是PK
  • 实体是受更新
  • 影响的表格
  • 操作类型是对实体执行的操作(INSERT,UPDATE,DELETE)
  • 说明是解释变更的简要文字
  • OldDataXML是XML更改之前记录中的数据。

例如:

<User Name="Christopher" 
      Address="123 Fake Street" 
      Username="Lover1234" 
      UserType="1">
</User>

在此选项中,Users表上的记录将始终是最新记录,并且在日志表中您将获得更改的信息。

希望这可以帮到你。

答案 1 :(得分:0)

ChangeDataCapture内置于SQL Server 2008 R2中,可以处理此问题(http://technet.microsoft.com/en-us/library/bb522489%28v=sql.105%29.aspx

我通常使用的替代方法与@scubaFun在他的回答中非常相似,即创建一个反映原始表的日志记录表,以及更改类型列并更改(以及您想要的任何其他内容)和然后在主表上使用触发器来填充日志记录表。