保持每列的更新更改

时间:2014-07-23 23:45:52

标签: sql-server database

我的客户已要求我管理其中一个SQL Server表中每个列/字段的更新历史记录。我以前管理过整个行的“批处理”版本,但之前没有完成此类备份/历史记录。他们希望能够跟踪表格行中每列/字段的更改。我可以用最有效的方式帮助跟踪这个问题。谢谢!

2 个答案:

答案 0 :(得分:1)

我不久前曾在一个类似的数据库上工作,没有删除任何行,每次更新记录时,它实际上都添加了一个新行并为其分配了版本号。类似......

每个表格都有两列

Original_ID |  Version_ID

每次添加新记录时,都会为其分配一个序列Version_ID,这是一个唯一列,Original_ID列保持为NULL,对此行的每次后续更改都会实际插入一个新行表格和增加的Version_ID和第一次创建记录时分配的Version_ID将分配给Original_ID

如果您有某些需要删除记录的情况,请使用BIT列Deleted并在假设要删除记录时将其值设置为1,其名称为(软删除)。

还添加类似LastUpdate日期时间的列,以跟踪进行更改的时间。

这样,您将最终得到一行的所有版本,从插入行开始直到删除它(软删除)。

答案 1 :(得分:1)

答案是触发器和历史表,但最佳实践取决于数据库保存的数据以及修改频率和修改程度。

基本上每次更新表中的记录时,都会通知更新触发器(附在表中)旧记录的内容以及新记录的外观。然后,您可以将更改历史记录写入另一个表的新记录(即tblSomething_History)。注意:如果您的表的更新是通过存储过程完成的,那么可以从那里写入历史记录,但问题是如果另一个存储过程也更新了您的表,那么历史记录赢了&#39写的。

根据您想要历史记录的字段/表的数量,您可以按照@ M.Al的建议进行操作,您可以通过版本控制将历史记录直接嵌入到基表中,或者您可以为每个人创建历史记录表表,或者您可以创建一个通用历史表,例如:

| TblName | FieldName | NewValue | OldValue | User | Date Time | 

获取修改时间很简单,但这取决于安全设置,以确定哪个用户更改了内容。将历史记录保存在单独的表中意味着对检索当前数据的影响较小,因为它已经分开,您不需要将其过滤掉。但是如果你需要在大部分时间里显示历史记录,这可能不会产生同样的效果。

不幸的是,您无法向数据库中的所有表添加单个触发器,您需要为每个表创建单独的触发器,但是他们可以调用单个存储过程来完成实际工作的内容。

另一个警示词:自动加载与表关联的所有历史记录可以显着增加所需的负载,具体取决于表中存储的数据类型,历史记录可能会比基表系统地大。我已经遇到并受到许多已经变得无法使用的应用程序的影响,因为历史表在基表时被不必要地加载,并且假设表的更改历史记录可以达到每个项目100个,那么'加载时间增加了多少。

最后注意事项:如果从头开始内置到您的应用程序中,这是一种易于吸收的策略,但要小心将其用于现有解决方案,因为如果不是根据您的需求量身定制,它会对性能产生巨大影响要求。并且可能比客户期望的成本更高。