gpt4 book ai didi

c# - 在数据库中保留数据更改的历史记录

转载 作者:可可西里 更新时间:2023-11-01 08:34:26 25 4
gpt4 key购买 nike

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

所以更清楚:

  1. 我正在使用 NHibernate 进行数据访问并希望远离数据库依赖性(用于使用 SQL server 2005 进行测试)

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

用法示例如下:

  • 我有一篇新闻文章
  • 有人对该文章进行了一些修改
  • 主编看到这条新闻有错别字
  • 它决定回滚到以前的有效版本(直到更正最新版本)

我希望我给了你有效的信息。

最佳答案

当主表发生变化时存储变化的表称为审计表。您可以通过多种方式执行此操作:

  • 在数据库中使用触发器:我会推荐这种方法,因为如果不创建记录,数据就无法更改。执行此操作时,您必须考虑 3 种类型的更改:添加、删除、更新。因此,您需要适用于所有这三者的触发器功能。

另请记住,一个事务可以同时修改多条记录,因此您应该处理整套修改后的记录,而不仅仅是最后一条记录(大多数人后来才意识到他们这样做了)。

在触发器执行完成之前,控制权不会返回给调用程序。因此,您应该使代码尽可能轻便和快速。

  • 在中间层使用代码:这种方法可以让您将更改保存到不同的数据库,并可能减轻数据库的一些负载。但是,运行 UPDATE 语句的 SQL 程序员将完全绕过您的中间层,您将没有审计线索。

审计表的结构

您将拥有以下列:
Autonumber PK、TimeStamp、ActionType + 原始表中的所有列
我过去曾通过以下方式做到这一点:

表结构:
自动编号 PK、TimeStamp、ActionType、TableName、OriginalTableStructureColumns

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

此结构可让您保存任何表,但您必须为触发器中的每一列创建名称值对。这是非常通用的,但价格昂贵。您还需要编写一些 View 以通过对数据进行逆透视来重新创建实际行。这变得很乏味,通常不是遵循的方法。

关于c# - 在数据库中保留数据更改的历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1952913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com