1

我可以将 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 包一起工作?甚至可能吗?

4

3 回答 3

2

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

正如另一位响应者指出的那样,CDC 只能告诉您自上次提取更改以来每个源表中发生了什么变化。

使用 CDC 从多个源表中提取更改以加载单个目标表绝非易事。

让我们通过一个例子来说明原因。对于这个例子,我假设一个临时表是一个在填充之前被例行截断的表。

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

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

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

于 2014-04-15T18:11:37.587 回答
0

好的第一件事 CDC 捕获表中的更改,因此如果表中存在一些插入、删除或更新,那么将创建一个 CDC 记录,并带有指示插入、更新或删除的指示符,并且所有 CDC 任务所做的就是将记录输出到一个基于该指标列的三个输出中的一个,所以回到您的问题,您可能必须为每个 Source 和 UNION ALL 类似操作(插入、更新、删除)有多个 OLDEDB 源和 CDC 任务,然后是目标组件或 OLEDB 命令组件希望这会有所帮助:)

于 2013-12-30T21:00:29.613 回答
0

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

我的假设是,您正在从不同的表中提取数据,例如

  • 一个订单表,
  • OrderDetail 表等

如果您从相同或不同数据库中的多个相同表中提取数据,则可以将 CDC 的输出直接推送到临时表中,然后就完成了。

于 2014-01-29T21:21:10.203 回答