【问题标题】:How do I reconstruct a historical view?如何重建历史观?
【发布时间】:2012-08-13 00:05:14
【问题描述】:

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

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

看起来我需要获取日志并开始将其应用到我的原始表上,但我想知道是否有内置的方法来执行此操作。有什么建议么?

我正在研究的一些用例:

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

【问题讨论】:

  • 你想计算差异是什么意思?示例输出?
  • @Jaguar:添加了两个用例。谢谢!

标签: sql sql-server sql-server-2008 cdc change-data-capture


【解决方案1】:

这是可能的,但不是用内置的方式,我很害怕。您必须手动重建时间线。

鉴于更改跟踪表提供 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 感谢您的时间和精力!我将更深入地探索并适应它。获得赏金! :)
【解决方案2】:

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.

【讨论】:

  • 如果您提前知道要保留数据副本的时间,快照会很有用。如果您想知道“昨天下午 2 点的状态是什么”,而您没有在昨天下午 2 点拍摄快照,那么他们不会提供帮助。
【解决方案3】:

对此我不确定,从未做过类似的事情,但也许您可以在表格中添加一个“变更集”列,以跟踪您在表格上所做的更改,每次有事务时获取max(changeset) 并使用下一个值保存新的 cahnges... 或者,如果您有时间戳并想知道您的表在特定时间的状态,请执行查询以过滤您要检查的日期之前的更改... (不知道我应该写这个是作为答案还是评论......我是新来的)

不管怎样,希望对你有帮助……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 2012-10-25
    • 2013-04-08
    • 1970-01-01
    • 2016-08-15
    • 2011-08-30
    • 2021-11-25
    • 1970-01-01
    相关资源
    最近更新 更多