0

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

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 链接表,我可以删除记录。

有任何想法吗?

4

2 回答 2

1

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

使用补丁 5043675、6637236

您可以从 Oracle Support 下载它们。

于 2010-02-15T16:21:10.507 回答
0

好的,结果证明这是一个简单的解决方法,但解释很复杂。

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

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

我希望这对某人有所帮助。我通过反复试验和互联网上的点点滴滴发现了这一点。感谢您在这个问题上提供的所有帮助。

于 2010-02-15T16:39:59.117 回答