如何实现历史版本控制?

Rob*_*t G 4 c# sql nhibernate s#arp-architecture asp.net-mvc-2

我们正处于构建SQL 2008 R2上的大型C#MVC2应用程序(我们还将Sharp架构和Nhibernate作为生态系统的一部分)的早期阶段,其中一个要求是所有数据库行版本都可以在给定的时间段内访问历史.

我们玩弄了类似于以下布局的想法:

id(PK)
recordId
versionId

并且使用相同的recordId和递增的versionId创建新记录中的每个编辑记录结果.然后记录显示将按照SELECT ... WHERE recordId = X AND versionId = MAX(versionId)的内容完成.

每个事务的快照都不起作用(太多了?并且无法从应用程序中轻松访问).

但我们很好奇其他实施方案是否已成功尝试,或者我们的提案存在潜在问题.

one*_*hen 7

你似乎暗指一个时态表.三种方法:

有效状态表:附加两个'timestamp'列(例如类型DATETIME),一个指定行何时生效,另一个指定行何时停止有效,中间时间是行的有效期

事务时间状态表:将每行与该监视表中存在的行的时间段相关联,从而允许重建任何先前时间点的被监视表的状态.

双时态表:捕获有效时间和事务时间,同时记录企业的历史记录,同时还捕获该历史记录的更改序列.

资料来源:在SQL中开发面向时间的数据库应用程序(Richard T Snodgrass).


Joe*_*nez 3

我们有一个由 DBA 开发的系统,可以作为更新/删除的触发器。有一个辅助表几乎镜像了正在审核的表(除了一些其他详细信息,如事务时间、用于更新的登录名、服务器等)。每当有人进行更改时,都会通过触发器将其记录在表的审核版本中。架构发生变化时必须保持审核触发器最新,这有点烦人,但这就是生活。

这样做的好处是应用程序根本不需要关心这种审核......因此它使应用程序代码的概念计数保持较低(呃)。

它正在生产中,适用于每天交易数数万的表。当然,您的里程可能会根据服务器的大小和数据的性质等许多因素而有所不同,但它对我们有用:-)