MS SQL Server:使用CDC从多个源表填充单个目标表

时间:2013-12-30 08:12:33

标签: sql-server-2008 ssis data-warehouse etl change-data-capture

我可以在MS SQL Server(2008或2012)中使用将数个源表连接到一个目标表的SSIS包中的变更数据捕获吗?

Technet文章描述了源表和目标表具有相同结构时的CDC + SSIS用例。对自定义数据转换进行更改跟踪的唯一提示是,可以指定CDC将跟踪更改的列。

问题是,我需要组合来自多个源表的数据以获取目标表,然后使其与这些源表保持同步。

这是因为目标数据仓库中的数据规范化程度低于源数据库中的数据。例如,我有事件表(包含计算机ID,日期/时间和事件描述)和计算机表(包含计算机ID和计算机名称)。我不需要目标表中的那些规范化表和计算机ID,因此填充目标表的选择应该是:

INSERT INTO DestDB..ComputerEvents (ComputerName, DateTime, Event) 
SELECT s.ComputerName, e.DateTime, e.Event
FROM SourceDB..EventLog e
JOIN SourceDB..ComputerNames s
ON e.CompID = s.CompID

我只是无法弄清楚如何让CDC与包含这种转换的SSIS包一起工作?它甚至可能吗?

3 个答案:

答案 0 :(得分:2)

回答这个问题:不,你不能。

正如另一位响应者指出的那样,CDC只能告诉您自上次提取更改以来EACH源表中的更改。

使用CDC从多个源表中提取更改以加载单个目标表是非常简单的。

让我们通过一个例子说明原因。对于此示例,我假设登台表是在填充之前例行截断的表。

假设我们有两个源表:Order,OrderDetail。我们有一个目标事实表FactOrder。 FactOrder包含OrderKey(来自Order)和OrderDetail的订单金额之和。客户订购3种产品。一个Order和3个OrderDetail记录被插入到源数据库表中。我们的DW ETL提取1个订单记录(插入)和3个OrderDetail记录(插入)。如果我们选择将更改的记录加载到临时表中,之前的响应者说我们可以简单地加入我们的临时表来创建FactOrder记录。但是,如果我们不再携带其中一个产品并且有人从OrderDetail记录中删除记录,会发生什么。下一个DW ETL提取1个OrderDetail记录(删除)。我们如何使用此信息更新目标表?显然,我们无法从Order加到OrderDetail,因为Order没有这个特定OrderKey的记录,因为它是我们刚刚截断的临时表。我选择了一个删除示例,但如果更新了相关表,则会考虑相同的问题。

我建议的是提取构造FactOrder记录所需的任何源表中的更改的一组不同的主键(在我们的示例中为OrderKey),然后在一个源表中提取完整的FactOrder记录。后续请求。例如,如果更改了5个订单记录,我们就知道5个OrderKey值。如果更改了30个OrderDetail记录,我们需要确定不同的OrderKey值集。让我们说这是10 OrderKey。然后我们联合两套。让我们说有重叠,以便产生12个OrderKey值。现在我们使用12个OrderKey值为FactOrder提取查询设定种子。我们得到12个完整的FactOrder记录。然后,我们使用新的存储二进制校验和的比较来确定如何操作12个记录(插入或更新)。上述方法不包括Order表中的删除。这些将导致FactOrder的重复删除。

如您所述,许多示例显示了如何使用CDC将数据从1个源复制/同步到1个目的地,这不是典型的数据仓库负载用例,因为数据仓库中的表通常是非规范化的(因此需要多个源表之间的连接来构建目标行。)

答案 1 :(得分:0)

确定CDC首先捕获表中的更改,因此如果表中有一些插入或删除或更新,则会创建一个CDC记录,其中包含一个指示符,表示插入或更新或删除,并且所有CDC任务都会输出记录到基于该指标列的三个输出中的一个,因此回到您的问题,您可能必须为每个Source和UNION所有类似操作(插入,更新,删除)和目标组件一起拥有多个OLDEDB源和CDC任务或OLEDB Command组件希望这有助于:)

答案 2 :(得分:0)

使用一个指向一个常规登台表的CDC源表,将CDC视为用于填充登台表(而不是sql查询或复制)的自动机制。从那里只需根据需要针对多个临时表构建联接查询。

我的假设是,您从非相同的表中提取数据,例如

  • 订单表,
  • OrderDetail表等

如果您从相同或不同dbs中的几个相同的表中提取,那么您可以将CDC的输出直接推送到临时表中,然后就完成了。