在现有CRUD应用程序中实现数据回滚

时间:2009-09-16 14:14:02

标签: .net sql-server crud rollback undo

我有一个现有的CRUD应用程序,我的任务是实施“坟墓石”。我需要一种方法来允许用户将给定的数据页面回滚到之前的状态。

说我在这个应用程序的页面上有名字,姓氏和社会安全号码。用户A更新“姓氏”字段。之后,用户B注意到新姓氏不同,并希望看到谁更改了它并在必要时将其回滚。

我对此并不陌生,所以如果我遗失或滥用某些条款,请原谅我。

这个应用程序有一个MS SQL后端,DAL主要是SPROCS。现在没有任何归档或坟墓石头可言。

我曾想过为每个现有的桌子做一个名为tblPerson的桌子 - > tblPersonTombstone然后回滚部分将从该表中读取。遗憾的是,原始数据库设计人员以这样一种方式设计它,即应用程序中的单个页面可能包含来自2个或3个不同表的信息。因此,我想,我需要一种更基于交易的方法。

任何方向或指针都将非常感激。我的想法是否在正确的轨道上?也许我过度复杂了?别人怎么做的?

我看到这篇文章How to implement ‘undo’ operation in .net windows application?以及这篇文章New CodePlex project: a simple Undo/Redo framework,但我认为这不符合我的实际情况。我不想让用户点击ctl + z。我需要让他们将整页回滚到以前的状态。如果我误解了这两个例子的使用,请说出来。

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

您所谈论的内容属于审核主题。不幸的是,这是更复杂的实现之一。

这是一个最佳实践:

创建镜像正在审核的表的新“修订表”,但还包括一些额外的元数据(版本号,时间戳,进行更改的用户,CRUD操作的类型)。

这个想法是能够在任何时间点轻松获取记录的完整快照,然后使用它来完成回滚。您完全相信数据是正确的,它只是起作用。

大多数人使用触发器来填充这些修订记录。

还有其他解决方案。显然这样做会耗费大量时间和磁盘空间密集(但是,嘿,你可以在不破坏系统的情况下安全地清除旧记录)。优点是你最终具有很大的灵活性。

这就是大多数人这样做的方式。

这是另一种方式:

我还实现了一个更简单的审核模式,它只跟踪更改的表的名称,更改的字段,旧值和新值,以及通常的元数据。

有了这个,我为我的ORM工具编写了一个插件,它可以自动处理审计数据的保存。否则这将是非常繁琐的。

你可能很想走这条路。这是真的,你可能会从中获得回滚。但这将更加困难。例如,如果要还原到任何给定的日期和时间,则必须分析所有这些单独的字段级更改记录,以便重新创建完整的快照。如果你改变了田野的名字,你就有祸了!

因此,这种审计方法适用于生成和显示审计跟踪,但如果要进行回滚,则会有更多移动部件,以及可能出错的更多内容。注意我的话:如果你需要回滚,那就远离这个,这比创建那些修订表要多得多!

<强>链接

这是一个关于stackoverflow的链接,他们谈到在SQL Server中实现审计,有些人提到了SQL 2008 Enterprise中新增的Change Data Capture ......它不会自动执行回滚,但会存储审计数据:< / p>

Suggestions for implementing audit tables in SQL Server?

答案 1 :(得分:1)

2个想法:

  1. 创建一个存档表,该表不一定是您的持久表的副本,而只是表示具有回滚功能的页面上的数据。因此,如果页面包含影响多个表的字段,则归档表将包含页面上每个可变字段的列。

  2. 如果页面上的数据封装在单个DTO或实体对象中,请在对象之前序列化该对象并将其存储在anarchive表中。然后,如果用户希望回滚,您可以反序列化它,然后保存反序列化的对象。