我如何重建历史视图?

时间:2012-08-13 00:05:14

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

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

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

看起来我需要记录并开始在原始表上应用它,但我想知道是否有内置的方法来做到这一点。有什么建议?

我正在查看的一些用例:

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

3 个答案:

答案 0 :(得分: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 :(得分: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.

答案 2 :(得分:0)

我不确定这一点,从来没有做过类似的事情,但也许你可以在表格中添加一个“变更集”列,可以跟踪你在桌子上的变化,每次交易得到max(changeset)并使用下一个值保存新的cahnges ...或者如果你有一个时间戳并想知道你的表在某个时间的状态,请查询过滤你要检查的日期之前的更改... (不确定我是否应该写这个作为答案或评论......我是新来的)

无论如何,希望它有所帮助......