我有一个简单的问题。如何跟踪SQL Server表中某行的更改?这是我想要的一个例子。
表:用户
列:名称|地址|用户名|用户类型
第1行:Christopher | 123假街| Lover1234 | 1
如何跟踪用户将“Christopher”更改为“Robert”的时间,或者他们是否将“123 Fake Street”更改为“124 Fake Street”。我需要知道更改的时间,以及更改的旧值。我还希望能够跟踪UserType是否更改(这是一个外键),所以我需要知道如何跟踪外键更改。
这可能发生在多个不同的表中,我想跟踪多个不同的表。
答案 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
然后,每次更新发生时,在此处插入记录。
例如:
<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在他的回答中非常相似,即创建一个反映原始表的日志记录表,以及更改类型列并更改(以及您想要的任何其他内容)和然后在主表上使用触发器来填充日志记录表。