1

我正在研究管理每周数据馈送到第 3 方 OLAP 服务的最佳实践。分析数据库将使用完整的数据转储进行初始化。随后的每周提要将提供新的和更新的行。数据来源于 SQL Server 2005 数据库。

检测新行和更新行的首选方法是什么?

  1. 在插入和更新时触发修改日期字段,并获取大于上次提要提取的日期;或者

  2. 源表上的时间戳列,并抓取时间戳大于上次提要提取的行;或者

  3. 一些我没想到的好主意……

4

2 回答 2

2

好吧,这取决于您如何定义更改的行。

数字 2 有效,但对该行的任何更改都会更改时间戳,即使是实际上不会更改任何内容的更新(例如将值从 1 更新为 1)。听起来很傻,谁会这样做?但是当你使用动态代码时很容易做到。

可以修改数字 1 以确保触发器中插入和删除的表之间存在差异,并修复选项 2 的问题。

但是,假设您有三个不同的提要,每个提要都包含可能在相关表中的不同列,并且您只想在其中一个实际更改时发送。现在,触发器对您的提要不够具体。我们使用更改数据跟踪来识别自上次发送日期以来哪些行发生了更改(我们将其存储为所有 SSIS 包的一部分),然后计算特定列的行哈希数据以查看我们感兴趣的数据是否实际更改。我还看到人们使用发送内容的历史表,然后将这些值(如果您只对表中的一两个字段感兴趣)与更改数据跟踪表中实际更改的值进行比较。当你有一个特定的需求时,你最终会得到一个相当复杂的系统来支持它(我只是给你一个粗略的想法)。

于 2011-06-30T22:25:34.787 回答
1

正如 HLGEM 所说,时间戳不是一个好主意。触发器是一个不错的选择,但这里还有一个问题——您打算如何存储更改?只是将所有记录克隆到历史表?答案取决于你有多大的存储空间。如果是,或者如果您必须仅存储有限的历史记录(例如,只有 1 年的历史记录) - 您可以这样做。但是,如果您的存储空间有限,或者如果您想将所有更改存储在一个表中,我建议使用我更喜欢的方法:使用 OUTPUT 子句并将仅更改的列值存储在一个表中作为 XML。我在我的博客中描述了这种技术:part_1 , part_2

于 2011-07-01T06:20:08.287 回答