SQL Server:SQL ServerでORACLEのリンクサーバー作成時のエラーとその対処方法
SQL ServerでORACLEのリンクサーバー作成時や作成後”OpenQuery”でSELECT文を実行したときなどに発生したエラーとその対処方法を記述。
原因に気づくまでかなり時間がかかってしまったのと、使うプロバイダによってエラーもバラバラでとにかく悩まされたので覚書しておく。
前提条件
この記事は、SQL Serverが動作しているPCにORACLEのクライアントソフトなり、「Instant Client」なりがセットアップ済みで、ORACLEと接続できる環境になっていることを前提として記述しています。
「Instant Client」のセットアップやセットアップ後の動作確認等については、関連する記事を参照してください。
発生したエラーメッセージ
以下発生したエラーメッセージを記載する。
以下に記述するエラーメッセージは、リンクサーバーを作成時、また作成時にはエラーが発生しなかったにもかかわらず、OpenQueryを使用して作成したリンクサーバー上のテーブルをSELECTした際などに発生したエラーメッセージです。
どの時にエラーが発生したかや正確なエラーメッセージについてはうろ覚えなため単純にこんなメッセージだったなーという感じで列挙しています。(いい加減でごめんなさい)
従って、似たようなエラーメッセージやここに記述されていないエラーメッセージであってもリンクサーバー作成時やOpenQuery実行時に何かしらのエラーが出る場合は対処方法を試してみてください。
発生エラー No.1
リンク サーバー “XXX" の OLE DB プロバイダ “MSDASQL" から、メッセージ “[Microsoft][ODBC Driver Manager] 接続文字列の属性が無効です。" が返されました。
発生エラー No.2
リンク サーバー “XXX" の OLE DB プロバイダ “MSDASQL" のデータ ソース オブジェクトを初期化できません。
発生エラー No.3
“アクセスが拒否されました"
発生エラー No.4
リンクサーバー"XXX"のOLE DBプロバイダ"MSDAORA"のデータソースオブジェクトを初期化できません。 “Oracleクライアントとネットワークコンポーネントが見つかりません。"
プロバイダは、これらのコンポーネントがインストールされるまで機能しません。
プロバイダー名"MSDORA"は、使うプロバイダーによって変わります。 例えば、OraOLEDB.Oracleを使っている場合は、"MSDAORA"の部分が"OraOLEDB.Oracle"に変わります。
発生エラー No.5
リンク サーバー “oracle" の OLE DB プロバイダ “MSDAORA" から、メッセージ “Error while trying to retrieve text for error ORA-12154 " が返されました。
メッセージ 7303、レベル 16、状態 1、行 1
リンク サーバー “oracle" の OLE DB プロバイダ “MSDAORA" のデータ ソース オブジェクトを初期化できません。
発生エラー No.6
メッセージ 7399、レベル 16、状態 1、行 1 リンク サーバー “ora" の OLE DB プロバイダ “OraOLEDB.Oracle" により、エラーがレポートされました。
プロバイダが予期しない重大なエラーをレポートしました。
メッセージ 7330、レベル 16、状態 2、行 1 リンク サーバー “ora" の OLE DB プロバイダ “OraOLEDB.Oracle" から行をフェッチできません。
発生エラー No.7
“OraOLEDBpus10.dll: 指定されたモジュールが見つかりません。"
発生エラー No.8
リンクサーバー"ORACLE"のOLE DBプロバイダ"OraOLEDB.Oracle"のインスタンスを作成できません。(Microsoft SQL Server、エラー:7302)
以上、一応確認できたエラーメッセージは、こんな感じです。 他にも出た気がしましたが、保存してなくて載せることができませんでした。
エラーが発生した環境について
これらのエラーが出た環境は以下のとおりです。
- SQL Server Expressが動作しているマシンに「Oracle Instant Client」をセットアップ
- ODBCドライバ、SQL*Plusでの動作確認、動作テストでは正常
- フリーのデータベースアクセスツール「黒猫 SQL Studio」でSELECT実行による正常動作
何れもOracleへのアクセスが正常に動作することを確認できた環境で発生したエラーです。
エラーの原因について
エラーの原因は、結果的にはOracleのクライアントツール(ここでは、「Oracle Instant Client」)がセットアップされているフォルダに対してSQL Serverを実行しているアカウント(「SQL Server (SQLEXPRESS)」サービスのログオンアカウント)がアクセス権を持っていなかったため発生していたようです。
アクセス権を付与し、SQL Serverを再起動後リンクサーバーを作成しなおしたところエラーが発生しなくなりリンクサーバーの作成が正常に終了しました。
また、作成したリンクサーバーに対してOpenQueryを使用してリンクサーバーのテーブルに対してSELECT文を発行してもエラーも出ず正常に結果が出力されました。
エラー発生時の対処方法について
対処方法は、原因にも記述したように、「SQL Serverを実行しているアカウントに対してOracleのクライアントツールがセットアップされているフォルダへのアクセス権を与える」ということになります。
SQL Serverを実行してるアカウントの確認方法は以下の通りです。(通常は、「NT AUTHORITY\NetworkService」です。)
- [マイコンピュータ]を右クリックし、[管理]をクリックする。
- [コンピュータの管理]画面が表示されるので、[サービスとアプリケーション]の1つ下の階層にある[サービス]をクリックする。
- [コンピュータの管理]画面右側のサービスの一覧から[SQL Server (SQLEXPRESS)]を見つけてダブルクリックする。
- [(ローカルコンピュータ)SQL Server(SQLEXPRESS)のプロパティ]ダイアログボックスが表示されるので、[ログオン]タブをクリックする。
[ログオン]タブの[アカウント]テキストボックスに表示されているアカウントがSQL Serverを実行しているアカウントになります。
実行アカウントが確認できたら、あとはそのアカウントにOracleのクライアントツールがセットアップされているフォルダへのアクセス権を付与すればよいのですが、その前にSQL Serverを実行しているマシンのローカルユーザーグループ"Administrators"にSQL Serverの実行アカウントを追加してエラーが回避できるか簡単に確認してみてください。
ローカルユーザーグループ"Administrators"に実行アカウントを追加後、SQL Serverを再起動し、めんどくさくてもリンクサーバーを作り直した上で回避できるかどうか確認してください。
回避できるかできないか確認後、"Administrators"から実行アカウントは削除してください。
そして回避できた場合は、実行アカウントにOracleのクライアントツールがセットアップされているフォルダへのアクセス権を付与してください。
付与後はSQL Serverの再起動を忘れずに。
私がリンクサーバー作成時に悩まされた数々のエラーは、この対処方法で解決できましたが、これでも解決できない場合は、残念ながらわかりません。
リンクサーバー作成時に発生するエラーについて他に解決策やわかったことがあったらコメントを頂けると幸いです。
リンクサーバーを使用することが少ないせいなのかググったり、関連のフォーラムを検索しても役立ちそうな情報を見つけることはできませんでした。
ちなみにMicrosoftの資料にリンクサーバー作成時の障害に関するトラブルシュートについて記述された資料がありますので、参考までにリンクを貼っておきます。
ディスカッション
コメント一覧
まだ、コメントがありません