检测数据Feed的已更改行的最佳做法是什么?

时间:2011-06-30 20:15:23

标签: sql-server timestamp datafeed

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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