【问题标题】:SSIS 2008 R2 Completes But Gives Error "Violation of PRIMARY KEY constraint"SSIS 2008 R2 完成但给出错误“违反主键约束”
【发布时间】:2015-05-21 14:02:52
【问题描述】:

我已经找到了许多关于此的链接,但到目前为止还没有一个有答案的链接。

问题:SSIS 2008 R2 包将数据从 SQL 2000 数据库(转换项目)的许多表(大约 160 个)导入到新结构中。这已经干净地运行了很多次。需要明确的是,数据似乎实际上是正确导入的。但是,最近 3 次,我遇到了这个错误。下面消息中显示的任务 (54) 源 (269) 是最后一步,也是该步骤中的项目。

我已经确认表中提到的“重复键违规”实际上与源具有相同的 49166 条记录。似乎它几乎只是线程问题或经过的时间(长时间运行的查询)。我在最后一步中截断了 5 个表并重新运行单个任务 54,它完成得很好,全是绿色的。

最好不要因为红鲱鱼而不必去打猎。关于如何解决这个问题以便它干净地报告的任何想法?

谢谢

错误信息如下:

以用户身份执行:[已屏蔽]。适用于 64 位的 Microsoft (R) SQL Server 执行包实用程序版本 10.50.6000.34 版权所有 (C) Microsoft Corporation 2010。保留所有权利。开始时间:下午 4:36:46 错误:2015-05-20 16:36:48.49 代码:0xC0016016 来源:描述:无法解密受保护的 XML 节点“DTS:Password”,错误为 0x8009000B“密钥在指定状态下无效."。您可能无权访问此信息。当存在加密错误时会发生此错误。验证正确的密钥是否可用。结束错误错误:2015-05-20 16:36:48.50 代码:0xC0016016 来源:描述:无法解密受保护的 XML 节点“DTS:Password”,错误为 0x8009000B“密钥在指定状态下无效。”。您可能无权访问此信息。当存在加密错误时会发生此错误。验证正确的密钥是否可用。结束错误错误:2015-05-20 17:19:33.78 代码:0xC0202009 源:数据流任务 54 目标 269 - cadNotificationStatus [396] 描述:SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误代码:0x80004005。 OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 10.0” Hresult:0x80004005 描述:“语句已终止。”。 OLE DB 记录可用。来源:“Microsoft SQL Server Native Client 10.0” Hresult:0x80004005 说明:“违反主键约束 'PK__cadNotif__25843E4F1B0907CE'。无法在对象 'dbo.cadNotificationStatus' 中插入重复键。重复键值为 (4, 2)。”。结束错误错误:2015-05-20 17:19:33.79 代码:0xC0209029 源:数据流任务 54 目标 269 - cadNotificationStatus [396] 描述:SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “输入“OLE DB 目标输入”(409)”失败,因为发生错误代码 0xC020907B,并且“输入“OLE DB 目标输入”(409)”上的错误行处理指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。结束错误错误:2015-05-20 17:19:33.79 代码:0xC0047022 来源:数据流任务 54 SSIS.Pipeline 描述:SSIS 错误代码 DTS_E_PROCESSINPUTFAILED。处理输入“OLE DB 目标输入”(409) 时,组件“目标 269 - cadNotificationStatus”(396) 上的 ProcessInput 方法失败,错误代码为 0xC0209029。已识别的组件从 ProcessInput 方法返回错误。该错误是特定于组件的,但该错误是致命的,将导致数据流任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。结束错误错误:2015-05-20 17:19:33.81 代码:0xC02020C4 源:数据流任务 54 源 269 - cadNotificationStatus [218] 描述:尝试向数据流任务缓冲区添加行失败,错误代码为 0xC0047020。结束错误错误:2015-05-20 17:19:33.81 代码:0xC0047038 来源:数据流任务 54 SSIS.Pipeline 描述:SSIS 错误代码 DTS_E_PRIMEOUTPUTFAILED。组件“源 269 - cadNotificationStatus”(218) 上的 PrimeOutput 方法返回错误代码 0xC02020C4。当管道引擎调用 PrimeOutput() 时,组件返回了失败代码。失败代码的含义由组件定义,但是错误是致命的并且管道停止执行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。结束错误 DTExec:包执行返回 DTSER_FAILURE (1)。开始时间:下午 4:36:46 结束时间:下午 5:19:34 经过时间:2568.01 秒。包执行失败。步骤失败。

【问题讨论】:

  • 如果您对该键值运行查询,您会得到什么?
  • 赞恩,很抱歉错过了您的评论/问题。正如我的帖子中提到的,尽管有错误报告,但所有数据都被传输,所有 49166 行。什么都没有。作业只是报告错误。

标签: sql-server sql-server-2008 ssis bids


【解决方案1】:

根据错误,在“dbo.cadNotificationStatus”表中插入重复记录时失败。是否有任何逻辑仅从 SQL 2000 中的源表中导入新记录,而目标表中不存在这些记录?如果没有,数据流任务导入数据到这个表会失败。

看起来,它运行成功,因为您正在截断表,然后再次导入整个数据。如果你能提供更多关于源查询的信息,那就更清楚了。

【讨论】:

  • 澄清...整个数据库在开始时是空的。新创建并从 SQL 2000 源导入数据。在此开始之前,整个集合中没有数据,并且该表的其他任何地方都不包含它。我会加倍(三倍,四倍)检查,但这就是我要解决的问题。因此,不应插入重复项,因为由于主键,源中没有重复项。
  • 1) 您是否每次都在包开始时截断表格? 2) SQL 2000 和 2012 版本的表结构是否完全相同?
  • 又是一个好问题。正在构建的数据库被删除,整个数据库是从脚本创建的。这主要是关于从 2000 年迁移到 2008 年。对于数据库的大小,这是确保所有结构都是原生 SQL 2008 结构的选择,尽管不需要更改字段或结构。我运行它的前 3 或 4 次,它从未给出错误。即使我从 BIDS 中运行它。然后它开始给出错误,但是当我比较导入的数据时,它被正确复制了。它只是报告它在 PK Violation 上失败。
【解决方案2】:

只是为了 100% 确定我会将行重定向到导致您出现问题的平面文件。这将允许您查看导致失败或触发错误消息的行项目。此链接显示了如何做到这一点的一个很好的教程:

http://www.techbrothersit.com/2013/07/ssis-how-to-redirect-invalid-rows-from.html

此外,从基于以下内容的安全角度来看,您的错误输出似乎还有更多内容:

描述:无法解密受保护的 XML 节点“DTS:Password”,错误为 0x8009000B“密钥在指定状态下无效。”。您可能无权访问此信息。

我的猜测是其他人创建了这个包并使用了:“EncryptSensitiveWithUserKey”...

我会推荐:

在将包导入 SQL Server 时选择保护级别:任一

1- 不要保存敏感数据。

或者

2- 依靠服务器存储和角色进行访问控制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多