我如何重建历史视图?

Leg*_*end 10 sql sql-server cdc change-data-capture sql-server-2008

我目前正在探索Change Data Capture作为存储时态数据库的选项.它很棒,因为它只存储增量,似乎它可以解决我的问题.当我启用CDC时,会出现一堆表格System Tables.

查询时cdc.dbo_MyTable,我能够看到桌面上发生的所有更改.现在,我将如何构建历史视图?例如,如果我想在特定日期看到我的桌子的状态,我将如何去做呢?这甚至可能吗?

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

我正在研究的一些用例:

  • 了解特定时间点的图形状态
  • 给出两个不同时间的图,知道不同的链接集(这可能是在构造表后使用EXCEPT子句获得的)

Jag*_*uar 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()*
Run Code Online (Sandbox Code Playgroud)

请注意,如果未删除行,则getdate()有效,在这种情况下,应将其替换为删除日期

编辑,针对2个用例.第一点很容易解决,这是构建时态对象图然后过滤的问题:

declare @pointInTime datetime = '20120102 10:00';
select * from Reconstructed_TG where FromDate <= @pointInTime and @pointInTime < ToDate
Run Code Online (Sandbox Code Playgroud)

第二点,可以使用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
Run Code Online (Sandbox Code Playgroud)

但该except子句仅显示具有至少一个不同列值的行; 我不知道这些信息对人眼是否真的有意义.根据您的需要,直接对cdc数据起作用的查询可能更合适.