在SQL Server 2008数据库中维护数据历史的方法

时间:2010-10-06 17:06:39

标签: .net sql sql-server-2008 entity-framework-4 change-tracking

很长一段时间以来,我们一直希望创建一个不会丢失历史记录的案例管理系统。当进行更改时,我们希望记录该更改,但能够返回到任何时间点并查看记录的外观。我想向Stack Overflow社区提出这个问题,看看有什么方法可以做到这一点,是否已经有技术来实现这一目标?

2 个答案:

答案 0 :(得分:8)

是的,这种技术肯定存在 - 实现它并且正确地执行它是一种努力。

您正在寻找的是时态数据库 - 请参阅一些资源:

答案 1 :(得分:3)

我不确定像marc_s这样的时态数据库是如何工作的,但如果您使用的是SQL Server 2008或更高版本,则可以利用其内置的变更数据捕获(CDC)功能:

启用CDC使用复制事务日志来存储表的插入,更新和删除,并创建表值函数,这些函数允许您检索给定日期/时间的行,或仅检索更改。

但是,您不能单独依赖CDC,因为您的事务日志将变得无法管理大而缓慢。所以你要做的是:

  • 启用CDC,
  • 使用与原始表相同的模式创建历史表,但添加了几列用于存储行版本信息(非常类似于关系OLAP数据库中的slowly-changing dimension),并且
  • 创建一个作业,该作业将定期轮询CDC函数,以便在上次加载后进行更改并将其推送到历史记录表

然后你可以在你的查询中使用历史表,像往常一样加入它,但是有一个额外的谓词来“记录”任何你想要的日期。