微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 如何重建历史视图?

我正在探索 Change Data Capture作为存储时间数据库的选项.这是伟大的,因为它只存储三角洲,似乎可以解决我的问题.当我启用CDC时,系统表下会出现一堆表.

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

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

我正在看的一些用例:

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

解决方法

这是可能的,但不是内置的方式我害怕.你必须用手重构时间线.

鉴于更改跟踪表提供了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数据上工作的查询可能更合适.

原文地址:https://www.jb51.cc/mssql/75650.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐