1

I have an existing CRUD app that I have been tasked with implementing "tomb stoning". I need a way to allow a user to roll a given page of data back to the previous state.

Say I have First Name, Last Name, and Social Security Number on a page in this app. User A updates the Last Name field. Later, User B notices that the New Last Name is different and wants to see Who changed it and roll it back if neccessary.

I am unfamilar with this so if I am missing or misusing some terms, forgive me.

This app has a MS SQL backend and the DAL is mostly SPROCS. Right now there isn't any archiving or tomb stoning to speak of.

I had thought to just make a table for each existing table called tblPerson --> tblPersonTombstone and then the roll back portion would read from that table. Unfortunately, the original DB designers designed it in such a way that a Single page in the App might contain info from 2 or 3 different tables. Thus, I would imagine, I need a more Transaction based approach.

Any direction or pointers will be greatly appreciated. Am I on the right track with my thinking? Maybe I am over complicating it? How have others done it?

I see this post How to implement ‘undo’ operation in .net windows application? and also this one New CodePlex project: a simple Undo/Redo framework but I am concered that neither fit my actual situaiton. I am not looking to let the users click ctl+z. I need to let them roll a whole page back to a previous state. If I am misunderstanding the use of those two examples then please say so.

Thanks for the time.

4

2 回答 2

2

你所说的属于审计的主题。不幸的是,这是涉及更多的实现之一。

这是一个最佳实践:

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

这个想法是能够在任何时间点轻松获得记录的完整快照,然后使用它来进行完美的回滚。您完全相信数据是正确的并且可以正常工作。

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

还有其他解决方案。显然,这样做会非常耗时且占用大量磁盘空间(但是,您可以安全地清除旧记录而不会破坏系统)。优点是您最终获得了很大的灵活性。

所以大多数人都是这样做的。

这是另一种方式:

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

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

你可能很想走这条路。确实,您可能可以从中获得回滚。但这会更困难。例如,如果您想恢复到任何给定的日期和时间,则必须分析所有这些单独的字段级更改记录才能重新创建完整的快照。如果你改变了一个字段的名称,你就有祸了!

所以这种审计方法可以很好地生成和显示审计线索,但是如果你想做回滚,它有更多的活动部分,还有更多可能出错的地方。注意我的话:如果您需要回滚,请远离这个,这不仅仅是创建那些修订表!

链接

这是 stackoverflow 上的一个链接,他们谈论在 SQL Server 中实现审计,有些人提到了 SQL 2008 Enterprise 中的新变化数据捕获......它不会自动回滚,但它确实存储审计数据:

在 SQL Server 中实施审计表的建议?

于 2009-09-16T14:25:47.473 回答
1

2个想法:

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

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

于 2009-09-16T14:26:00.667 回答