保持数据库中数据更改的历史记录

And*_*rin 11 c# sql

数据库中某行中的每次数据更改都应将以前的行数据保存在某种历史记录中,以便用户可以回滚到上一行数据状态.这种方法有什么好的做法吗?尝试使用DataContract并对数据对象进行序列化和反序列化,但它对复杂对象变得不那么混乱.

所以更清楚一点:

  1. 我使用NHibernate进行数据访问,并希望避免数据库依赖(对于使用SQL Server 2005进行测试)

  2. 我的目的是提供数据历史记录,以便每次用户都可以回滚到以前的某些版本.

使用示例如下:

  • 我有一篇新闻文章
  • 有人对那篇文章做了一些修改
  • 主编看到这个消息有一些错别字
  • 它决定回滚到以前的有效版本(直到更新最新版本)

我希望我能给你有效的信息.

Raj*_*ore 14

在主表更改时存储更改的表称为审计表.你可以这样做:

  • 在使用触发器的数据库中:我会推荐这种方法,因为如果没有记录,数据就无法改变.执行此操作时,您必须考虑3种类型的更改:添加,删除,更新.因此,您需要可在所有三个上运行的触发器功能.

还要记住,事务可以同时修改多个记录,因此您应该使用完整的修改记录集,而不仅仅是最后一条记录(因为大多数人迟迟没有意识到他们这样做了).

在触发器执行完成之前,控制不会返回到调用程序.因此,您应该尽可能快地保持代码的清晰.

  • 在中间层使用代码:此方法将允许您将更改保存到不同的数据库,并可能从数据库中卸载一些负载.但是,运行UPDATE语句的SQL程序员将完全绕过您的中间层,您将没有审计跟踪.

审计表的结构

您将拥有以下列:
Autonumber PK, TimeStamp, ActionType + All columns from your original table
我过去通过以下方式完成此操作:

表结构:
Autonumber PK, TimeStamp, ActionType, TableName, OriginalTableStructureColumns

此结构意味着您为每个保存的数据表创建一个审计表.数据保存和重建相当容易.我会推荐这种方法. 名称值对:
Autonumber PK, TimeStamp, ActionType, TableName, PKColumns, ColumnName, OldValue, NewValue

此结构将允许您保存任何表,但您必须为触发器中的每个列创建名称值对.这是非常通用的,但价格昂贵.您还需要编写一些视图以通过取消数据重新创建实际行.这变得乏味,通常不是遵循的方法.


Ser*_*oda 5

您可以使用触发器.这是一个例子.

 AutoAudit is a SQL Server (2005, 2008)
 Code-Gen utility that creates Audit
 Trail Triggers with:

     * Created, Modified, and RowVerwsion (incrementing INT) columns to table
     * view to reconstruct deleted rows
     * UDF to reconstruct Row History
     * Schema Audit Trigger to track schema changes
     * Re-code-gens triggers when Alter Table changes the table
Run Code Online (Sandbox Code Playgroud)

http://autoaudit.codeplex.com/


Rob*_*nto 5

Microsoft已在SQL Server 2008中引入了新的审计功能.这篇文章描述了一些功能和设计目标,这些功能和设计目标可能对您选择的任何方法都有帮助.

MSDN - 在SQL Server 2008中进行审计