数据库中某行中的每次数据更改都应将以前的行数据保存在某种历史记录中,以便用户可以回滚到上一行数据状态.这种方法有什么好的做法吗?尝试使用DataContract并对数据对象进行序列化和反序列化,但它对复杂对象变得不那么混乱.
所以更清楚一点:
我使用NHibernate进行数据访问,并希望避免数据库依赖(对于使用SQL Server 2005进行测试)
我的目的是提供数据历史记录,以便每次用户都可以回滚到以前的某些版本.
使用示例如下:
我希望我能给你有效的信息.
Raj*_*ore 14
在主表更改时存储更改的表称为审计表.你可以这样做:
还要记住,事务可以同时修改多个记录,因此您应该使用完整的修改记录集,而不仅仅是最后一条记录(因为大多数人迟迟没有意识到他们这样做了).
在触发器执行完成之前,控制不会返回到调用程序.因此,您应该尽可能快地保持代码的清晰.
审计表的结构
您将拥有以下列:
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
此结构将允许您保存任何表,但您必须为触发器中的每个列创建名称值对.这是非常通用的,但价格昂贵.您还需要编写一些视图以通过取消数据重新创建实际行.这变得乏味,通常不是遵循的方法.
您可以使用触发器.这是一个例子.
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/
Microsoft已在SQL Server 2008中引入了新的审计功能.这篇文章描述了一些功能和设计目标,这些功能和设计目标可能对您选择的任何方法都有帮助.