2012-08-13 54 views
10

我目前在探索Change Data Capture作为存储时态数据库的选项。这很棒,因为它只存储增量,并且似乎可以解决我的问题。当我启用CDC时,一堆表格出现在System Tables下。如何重建历史视图?

当查询cdc.dbo_MyTable时,我能够看到发生在表格上的所有更改。现在,我将如何构建一个历史观?例如,如果我想查看特定日期的表格状态,我该怎么做呢?这甚至有可能吗?

它看起来我需要采取日志,并开始将其应用于我的原始表,但我想知道是否有内置的方式做到这一点。有什么建议么?

部分的使用情况下,我在看:

  • 在特定时间点认识图形的状态
  • 给定两个不同时间的图表,知道不同的组链接(这可能可以在构造表后使用EXCEPT子句获得)
+0

你是什么意思你想计算差异?示例输出? – Jaguar 2012-08-20 07:48:24

+0

@Jaguar:增加了两个用例。谢谢! – Legend 2012-08-20 22:19:23

回答

6

这是可能的,但不是以内置方式,我是一个害怕。你将不得不手工重建时间线。

鉴于变更跟踪表提供了tran_end_time(即属性值应该被视为持续存在的时间),您必须进行一次查询,以获取表状态的所有不同时间段,加入被跟踪的属性发生变化,然后转动(以与表格相同的形式进行演示)。不要忘记与表状态本身结合,以获取未完成更改/跟踪的值。

最终结果,简化的,应该像

RN PK PropA PropB FromDate   ToDate 
1 1 'Ver1' 'Ver1' 2012-01-01 09:00 2012-01-02 08:00 
2 1 'Ver1' 'Ver2' 2012-01-02 08:00 2012-01-03 07:00 
3 1 'Ver2' 'Ver2' 2012-01-03 07:00 *getdate()* 
4 2 'Ver1' 'Ver1' 2012-01-01 05:00 2012-01-02 06:00 
5 2 'Ver1' 'Ver2' 2012-01-02 06:00 2012-01-03 01:00 
6 2 'Ver2' 'Ver2' 2012-01-03 01:00 *getdate()* 

说明该GETDATE()是有效的,如果不删除的行在这种情况下它应与删除日期被取代

编辑,为2个用例。 第一个点是很容易解决它的构造时间对象图然后过滤的问题:

declare @pointInTime datetime = '20120102 10:00'; 
select * from Reconstructed_TG where FromDate <= @pointInTime and @pointInTime < ToDate 

第二点,可以很容易地与except子句生成,如你指出。 给出上述查询:

declare @pointInTimeA datetime = '20120102 10:00'; 
declare @pointInTimeB datetime = '20120103 01:00'; 
select * from Reconstructed_TG where FromDate <= @pointInTimeA and @pointInTimeA < ToDate 
EXCEPT 
select * from Reconstructed_TG where FromDate <= @pointInTimeB and @pointInTimeB < ToDate 

except子句只呈现了具有至少一个不同的列值的行;我不知道这些信息对人眼是否真的有意义。根据您的需要,直接在cdc数据上运行的查询可能更合适。

+1

+1谢谢你的时间和精力!我会深入探讨并适应它。荣获赏金! :) – Legend 2012-08-21 23:21:31

0

You may want to check out Snapshots,自2005年以来

这将是最有用的你,如果你只需要几个时间点,但他们可以帮助你跟踪一个复杂的数据库中所有表的已建到SQL Server 。

这些都是三角洲,所以Compared to a full copy of a database, however, snapshots are highly space efficient. A snapshot requires only enough storage for the pages that change during its lifetime. Generally, snapshots are kept for a limited time, so their size is not a major concern.

+4

如果您知道您要保留数据副本的时间*提前*,则快照可能很有用。如果你想知道“昨天下午2点是什么状态”,并且你昨天下午2点没有拍摄快照,那么他们不会帮忙。 – 2012-08-15 06:41:56

0

我不知道这件事,从来没有做过这样的事情,但也许你可以添加一列“变更”来,可以让你有变化跟踪表在表格中,每次有事务获得最大值(变更集)并将下一个值保存到新的cahnge中......或者如果您有时间戳并且想在某个时间知道表的状态,请执行查询以过滤更改在你想检查的日期前... (不知道我是否应该写这个是作为回答或评论...我是新来的)

无论如何,希望它可以帮助...