在SQL Server 2008中针对链接服务器运行DELETE语句时出现问题

时间:2010-02-12 15:57:21

标签: sql sql-server oracle linked-server

我在运行此查询时遇到问题:

DELETE FROM [IRPROD]..[BUDGET_USER].[GL_EXP]
WHERE FISCAL_YEAR = 2010

IRPROD是Oracle 10g数据库的链接服务器。它使用Oracle OleDB提供程序进行链接。有大约79000条记录需要删除。运行此查询将删除54.再次运行它会给我这个错误消息。

Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "OraOLEDB.Oracle" for linked server "IRPROD" reported an error. The provider reported an unexpected catastrophic failure.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "OraOLEDB.Oracle" for linked server "IRPROD".

显然,“灾难性失败”是件坏事。但奇怪的是,我可以整天运行SELECT和INSERT语句,它运行正常。我有权删除行。此外,如果我通过Access链接表,我可以删除记录。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是OleDB提供程序和数据库错误5043675: 设置链接服务器可以正常读取数据,但更新或删除数据会因错误而失败。

使用补丁5043675,6637236

您可以从Oracle Support下载它们。

答案 1 :(得分:0)

好的,这是一个简单的解决方案,有一个复杂的解释。

第一个问题是过时的Oracle驱动程序。我们使用的是版本9提供商,因此我更新了通过我们的OIT商店提供的10g提供商。结果证明他们有一个错误。所以我卸载了它并安装了Oracle的10g提供程序,它已经更新以修复bug。

其次,我将'fiscal_year'字段从varchar2类型更改为数字类型。如果发送一个带有WHERE(或者任何条件子句,我只检查过WHERE)的DELETE语句,它与测试字段进行比较,那么SQL Server必须对表进行远程扫描,基本上检索数据并且必须 - by-one删除每一行。如果发送带有数字WHERE的DELETE语句,则SQL Server可以直接将查询传递给远程数据库,而无需进行远程扫描。

我希望这有助于某人。我通过反复试验和互联网上的碎片和碎片找到了这个。感谢所有帮助解决这个问题的人。