SSIS 2008 R2完成但出现错误“违反PRIMARY KEY约束”

时间:2015-05-21 14:02:53

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

我已经找到了很多这方面的链接,但到目前为止还没有找到答案。

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

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

由于红鲱鱼没有必要去寻找过程,这将是一件好事。关于如何解决这个问题的任何想法,以便干净地报告?

由于

以下错误消息:

  

以用户身份执行:[蒙面]。 Microsoft(R)SQL Server执行包实用程序版本10.50.6000.34(适用于64位版权所有(C)Microsoft Corporation 2010.保留所有权利。开始时间:4:36:46 PM错误: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描述:“违反PRIMARY KEY约束'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。组件“Destination 269-cadNotificationStatus”(396)上的ProcessInput方法在处理输入“OLE DB目标输入”(409)时失败,错误代码为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。组件“Source 269-cadNotificationStatus”(218)上的PrimeOutput方法返回错误代码0xC02020C4。当管道引擎调用PrimeOutput()时,组件返回失败代码。失败代码的含义由组件定义,但错误是致命的,管道停止执行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。结束错误DTExec:程序包执行返回DTSER_FAILURE(1)。开始于:4:36:46 PM完成时间:下午5:19:34经过:2568.01秒。包执行失败。步骤失败了。

2 个答案:

答案 0 :(得分:0)

根据错误,在'dbo.cadNotificationStatus'中插入重复记录时失败了。表。是否有任何逻辑只从SQL 2000中的源表导入新记录,这些记录在目标表中不存在?如果不是,将数据导入此表的数据流任务将失败。

看起来,它正在成功运行,因为您正在截断表,然后再次导入整个数据。如果您可以提供有关源查询的更多信息,则会更清楚。

答案 1 :(得分:0)

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

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

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

描述:无法解密受保护的XML节点" DTS:密码"错误0x8009000B"密钥无法在指定状态下使用。"。您可能无权访问此信息。

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

我建议:

将包导入SQL Server时,请选择“保护级别:

1-不要保存敏感数据。

或者

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