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 ステートメントを 1 日中実行でき、問題なく動作します。行を削除する権限があります。また、Access を介してテーブルをリンクすると、レコードを削除できます。

何か案は?

4

2 に答える 2

1

これはOleDBプロバイダーであり、データベースのバグ5043675:リンクサーバーのセットアップはデータの読み取りには正常に機能しますが、データの更新または削除はエラーで失敗します。

パッチ5043675、6637236を使用する

それらはOracleサポートからダウンロードできます。

于 2010-02-15T16:21:10.507 に答える
0

わかりました、これは複雑な説明で簡単な修正であることが判明しました。

最初の問題は、古い Oracle ドライバーでした。バージョン 9 プロバイダーを使用していたので、OIT ショップから提供された 10g プロバイダーに更新しました。彼らが持っているものにはバグがあることがわかりました。そのため、それをアンインストールし、バグを修正するために更新された Oracle の 10g プロバイダーをインストールしました。

次に、'fiscal_year' フィールドを varchar2 型から数値型に変更しました。テスト フィールドと比較する WHERE (または任意の条件句、私は WHERE のみをチェックしました) を含む DELETE ステートメントを送信すると、SQL Server はテーブルに対してリモート スキャンを実行する必要があります。各行を 1 つずつ削除します。数値の WHERE を使用して DELETE ステートメントを送信すると、SQL Server はリモート スキャンを実行せずに、クエリをリモート DB に直接渡すことができます。

これが誰かに役立つことを願っています。私は試行錯誤とインターネットからのビットとピースによってこれを見つけました. この質問を手伝ってくれてありがとう。

于 2010-02-15T16:39:59.117 に答える