违反主键数据流

时间:2019-01-29 12:57:38

标签: sql-server ssis

我有一个可以在2个数据库之间进行ETL的软件包。为了获取数据库源的数据,我在表中使用了触发器,因此我的数据保存在与转换类型一致的新表中:插入,更新和删除。

示例:

Id IdTableSource Transaction
1  1000          'Insert'   
2  1001          'Update'
3  1003          'Delete'
4  1000          'Update'

如果第1行和第4行位于同一IdTableSource的旁边。 在我的数据流中,我使用了一个用于条件的组件,并搜索目标表中是否存在记录,但是当发生上面的示例时,两行具有相同记录,但交易类型不同,我收到错误“ VPRIATION OF PRIMARY KEY”

我的流程是:

  • 来源
  • 视情况而定(插入,更新,删除)
  • 查找插入和更新
  • 如果我的表中不存在用于插入或更新的记录,请执行命令插入,否则执行命令更新。

对于第一个记录(示例1),在我的表中找不到该记录,然后执行命令Insert。

对于第二条记录(例如4号),也无法在我的表中找到该记录,然后执行命令Insert(我收到错误消息“ Violation of PRIMARY KEY”)。

我相信这会发生在SSIS的交易中,但我不知道解析器是什么

Example Data Flow

1 个答案:

答案 0 :(得分:2)

我不是百分百好的解决方案,但是如果我们要解决您遇到的问题,我有几件事要告诉您。

1:您有主键冲突,因为您在数据流中两次插入了命令。

enter image description here

2:我建议您不要这样的数据流。

enter image description here

在控制流中添加三个数据流任务。

我们将所有插入内容转移到第一个。

enter image description here

然后,我们将传输所有更新命令。您可以通过仅选择每个sourceId命令的最后更新而不是选择所有更新的标记来完善此步骤的选择命令。

enter image description here

最后一步是删除数据。

enter image description here

但是我认为您应该使用此解决方案而不是您的解决方案。

1:使用与源数据库相同的架构在目标数据库中创建一个临时表。

2:每次都截断该表。

3:将来自源服务器的所有数据带到目标数据库中的Temp表中。(所有插入的所有更新)

4:使用T / SQL合并命令合并临时表和目标表。

5:运行Delete命令以删除目标行。

注意:如果源表中有两个字段为(InsertedDate / UppdatedDate) 您不需要在表中触发来进行插入和更新。您可以将这些列与最近的传输日期一起使用(每次传输数据时都必须在某些位置进行注册)