この記事では、Microsoft SQL Server を実行しているコンピューターから Oracle データベースにリンク サーバーを設定する方法について説明し、リンク サーバーを Oracle データベースに設定するときに発生する可能性がある一般的なエラーの基本的なトラブルシューティング手順について説明します。
元の製品バージョン: Microsoft SQL Server 2005 Standard Edition、Microsoft SQL Server 2005 Developer Edition、Microsoft SQL Server 2005 Enterprise Edition、Microsoft SQL Server 2005 Express Edition、Microsoft SQL Server 2005 ワークグループ エディション
元の KB 番号: 280106
概要
この記事では、Microsoft SQL Server を実行しているコンピューターから Oracle データベースにリンク サーバーを設定する方法について説明し、リンク サーバーを Oracle にセットアップするときに発生する可能性のある一般的なエラーの基本的なトラブルシューティング手順について説明します。 この記事のほとんどの情報は、Microsoft OLEDB Provider for Oracle (MSDAORA) を使用するように構成されている環境に適用されます。 新しい開発作業ではこの機能を使用しないでください。現在この機能を使用しているアプリケーションを変更することを計画してください。 代わりに、Oracle の OLE DB プロバイダーを使用してください。
Oracle の OLEDB プロバイダーを使用してリンク サーバーを構成する方法の詳細については、「 Oracle とリンク サーバーを起動して実行する方法を確認してください。
Von Bedeutung
現在のバージョンの Microsoft ODBC Driver for Oracle は ODBC 2.5 仕様に準拠していますが、OLE DB Provider for Oracle はネイティブの Oracle 7 OCI API プロバイダーです。 ドライバーとプロバイダーの両方で、SQL*Net クライアント (または Oracle 8x 用の Net8 クライアント) と Oracle Call Interface (OCI) ライブラリ、およびその他の Oracle クライアント コンポーネントを使用して、Oracle データベースに接続し、データを取得します。 Oracle クライアント コンポーネントは重要であり、ドライバーとプロバイダーの両方を使用して Oracle データベースに正常に接続するように正しく構成する必要があります。
Microsoft Data Access Components (MDAC) バージョン 2.5 以降では、Microsoft ODBC Driver と OLE DB Provider の両方で Oracle 7 と Oracle 8i のみがサポートされ、次の制限があります。
CLOB、BLOB、BFILE、NCHAR、NCLOB、NVARCHAR2などの Oracle 8.x 固有のデータ型はサポートされていません。
Oracle 7.x および 8.x サーバーに対する Unicode 機能はサポートされていません。
複数の Oracle クライアント インスタンスまたは複数の Oracle ホームは、SYSTEM PATH 変数で Oracle ホームが最初に出現する場合に依存するため、サポートされていません。
ストアド プロシージャまたはバッチ SQL ステートメントから複数の結果セットを返す操作は、ADO または OLEDB を使用してサポートされていません。
入れ子になった外部結合はサポートされていません。
XML 永続化はサポートされていません。
8i より大きいバージョンは、これらのドライバーを使用してサポートされていません。
注
この資料に記載されているサードパーティ製品は、マイクロソフトと関連のない他社の製品です。 明示または黙示にかかわらず、これらの製品のパフォーマンスや信頼性についてマイクロソフトはいかなる責任も負わないものとします。
リンク サーバーを Oracle に設定する手順
リンク サーバーがセットアップされている SQL Server を実行しているコンピューターに Oracle クライアント ソフトウェアをインストールする必要があります。
SQL Server を実行しているコンピューターに、必要なドライバーをインストールします。 Microsoft では、Microsoft OLE DB Provider for Oracle と Microsoft ODBC Driver for Oracle のみがサポートされています。 サード パーティのプロバイダーまたはサード パーティ製ドライバーを使用して Oracle に接続する場合は、プロバイダーまたはドライバーを使用して発生する可能性がある問題について、それぞれのベンダーに問い合わせる必要があります。
Microsoft OLE DB Provider for Oracle と Microsoft ODBC Driver for Oracle を使用する場合は、次の点を考慮してください。
Microsoft Data Access Components (MDAC) に含まれている OLE DB プロバイダーと ODBC ドライバーの両方に、SQL*Net 2.3.x 以降のバージョンが必要です。 Oracle 7.3.x クライアント ソフトウェアまたはそれ以降のバージョンをクライアント コンピューターにインストールする必要があります。 クライアント コンピューターは、SQL Server を実行しているコンピューターです。
SQL Server を実行しているコンピューターに MDAC 2.5 以降のバージョンがインストールされていることを確認します。 MDAC 2.1 または以前のバージョンでは、Oracle 8 を使用するデータベースに接続することはできません。 x 以降のバージョン。
MDAC 2.5 以降のバージョンが Oracle クライアント ソフトウェアと連携できるようにするには、次の表に示すように、SQL Server を実行しているクライアント コンピューターでレジストリを変更する必要があります。
Oracle Client Microsoft Windows 2000 and later versions -------------------------------------------------------------------------- 7.x [HKEY_LOCAL_MACHINE\SOFTWARE Microsoft\MSDTC\MTxOCI] "OracleXaLib"="xa73.dll" "OracleSqlLib"="SQLLib18.dll" "OracleOciLib"="ociw32.dll" 8.0 [HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\MSDTC\MTxOCI] "OracleXaLib"="xa80.dll" "OracleSqlLib"="sqllib80.dll" "OracleOciLib"="oci.dll" 8.1 [HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\MSDTC\MTxOCI] "OracleXaLib"="oraclient8.dll" "OracleSqlLib"="orasql8.dll" "OracleOciLib"="oci.dll"
Oracle クライアント ソフトウェアをインストールした後、SQL Server を実行しているコンピューターを再起動します。
SQL Server を実行しているコンピューターで、次のスクリプトを使用してリンク サーバーを設定します。
-- Adding linked server (from SQL Server Books Online): /* sp_addlinkedserver [@server =] 'server'[, [@srvproduct =] 'product_name'] [, [@provider =] 'provider_name'] [, [@datasrc =] 'data_source'] [, [@___location =] '___location'] [, [@provstr =] 'provider_string'] [, [@catalog =] 'catalog'] */ EXEC sp_addlinkedserver 'Ora817Link', 'Oracle', 'MSDAORA', 'oracle817' -- Adding linked server login: /* sp_addlinkedsrvlogin [@rmtsrvname =] 'rmtsrvname'[,[@useself =] 'useself'] [,[@locallogin =] 'locallogin'] [,[@rmtuser =] 'rmtuser'] [,[@rmtpassword =] 'rmtpassword'] */ EXEC sp_addlinkedsrvlogin 'Ora817Link', 'FALSE',NULL, 'scott', 'tiger' -- Help on the linked server: EXEC sp_linkedservers EXEC sp_helpserver select * from sysservers
注
Microsoft ODBC Driver for Oracle を使用する場合は、
@datasrc
パラメーターを使用して DSN 名を指定できます。 DSN レス接続の場合、プロバイダー文字列は @provstr パラメーターを介して指定されます。 Microsoft OLE DB Provider for Oracle では、 @datasrc パラメーターに TNSNames.Ora ファイルで構成されている Oracle サーバー エイリアスを使用します。 詳細については、SQL Server オンライン ブックの「sp_addlinkedserver」トピックを参照してください。
一般的なエラー メッセージとそのトラブルシューティング方法
Von Bedeutung
このセクション、メソッド、またはタスクには、レジストリを変更する方法を示す手順が含まれています。 ただし、レジストリを誤って変更した場合、重大な問題が発生する可能性があります。 したがって、これらの手順を注意深く守ってください。 追加の保護のために、レジストリを修正する前にバックアップを取ってください。 その後、問題が発生した場合は、レジストリを復元することができます。 レジストリをバックアップおよび復元する方法の詳細については、マイクロソフト サポート技術情報の記事を表示するには、次の資料番号をクリックします。 322756 Windows でレジストリをバックアップおよび復元する方法
次の 2 つの方法のいずれかを使用して、分散クエリの実行時に発生するエラーに関する拡張情報を取得できます。
方法 1
SQL Server Management Studio を使用して SQL Server に接続し、次のコードを実行してトレース フラグ 7300 を有効にします。
DBCC Traceon(7300)
方法 2
SQL Profiler の [エラーと警告] イベント カテゴリにある "OLEDB Errors" イベントをキャプチャします。 エラー メッセージの形式は次のとおりです。
Interface::Method が 16 進数のエラー コードで失敗しました。
MDAC ソフトウェア開発キット (SDK)に含まれている Oledberr.h ファイルで、16 進数のエラー コードを検索できます。
次に、発生する可能性がある一般的なエラー メッセージの一覧と、エラー メッセージのトラブルシューティング方法に関する情報を示します。
注
SQL Server 2005 以降のバージョンを使用している場合、これらのエラー メッセージは若干異なる場合があります。 ただし、これらのエラー メッセージのエラー ID は、以前のバージョンの SQL Server のエラー ID と同じです。 そのため、エラー ID で識別できます。 パフォーマンス関連の問題については、「 最適化分散クエリ 」トピックを SQL Server オンライン ブックで検索してください。
メッセージ 1
エラー 7399: リンク サーバー "%ls" の OLE DB プロバイダー "%ls" でエラーが報告されました。 %ls
トレース フラグ 7300 を有効にするか、SQL Profiler を使用して OLEDB Errors イベントをキャプチャして拡張 OLEDB エラー情報を取得します。
メッセージ 2a
"ORA-12154: TNS:サービス名を解決できませんでした"
メッセージ 2b
"Oracle(tm) クライアントとネットワーク コンポーネントが見つかりませんでした。 これらのコンポーネントは Oracle Corporation によって提供され、Oracle バージョン 7.3.3 (またはそれ以上) のクライアント ソフトウェア インストールの一部です。
これらのエラーは、Oracle サーバーへの接続の問題がある場合に発生します。 Oracle サーバーへの接続に関する問題のトラブルシューティングについてはセクションを参照してください。その他のトラブルシューティングについては、以下のセクションを参照してください。
メッセージ 3
エラー 7302: リンク サーバー "%ls" の OLE DB プロバイダー 'MSDAORA' のインスタンスを作成できません。
MSDAORA.dll ファイルが正しく登録されていることを確認します。 (MSDAORA.dll ファイルは、Microsoft OLE DB provider for Oracle ファイルです)。RegSvr32.exeを使用して Microsoft OLE DB Provider for Oracle を登録します。
注
サードパーティの Oracle プロバイダーを使用していて、Oracle プロバイダーを SQL Server プロセスの外部で実行できない場合は、プロバイダー オプションを変更してインプロセスで実行できるようにします。 プロバイダー オプションを変更するには、次のいずれかの方法を使用します。
方法 1 次のレジストリ キーを見つけます。 次に、AllowInProcess (DWORD) エントリの値を 1 に変更します。 このレジストリ キーは、対応するプロバイダー名 (
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\ProviderName
) の下にあります。方法 2 次の手順に従って、SQL Server Management Studio (SSMS) を使用するプロバイダーの Allow inprocess オプションを設定します。
- SSMS を開き、SQL Server インスタンスに接続します。
- オブジェクト エクスプローラーで、Server Objects>Linked Servers>Providers に移動します。
- 構成するプロバイダーを右クリックし、 Properties を選択します。
- Provider オプション ウィンドウで、Allow inprocess オプションの Enable ボックスをオンにします。
メッセージ 4
エラー 7303: リンク サーバー "%ls" の OLE DB プロバイダー 'MSDAORA' のデータ ソース オブジェクトを初期化できません。 [OLE/DB プロバイダーから返されたメッセージ: ORA-01017: 無効なユーザー名/パスワード、ログオンが拒否されました]OLE DB エラー トレース [OLE/DB Provider 'MSDAORA' IDBInitialize::Initialize returned 0x80040e4d]。
このエラー メッセージは、リンク サーバーに正しいログイン マッピングがないことを示します。
sp_helplinkedsrvlogin
ストアド プロシージャを実行して、ログイン情報を正しく設定できます。 また、リンク サーバー構成の正しいパラメーターが指定されていることを確認します。メッセージ 5
エラー 7306: リンク サーバー "%ls" の OLE DB プロバイダー 'MSDAORA' からテーブル '%ls' を開くことができません。 指定されたテーブルが存在しません。 [OLE/DB プロバイダーから返されたメッセージ: テーブルが存在しません。][OLE/DB プロバイダーから返されたメッセージ: ORA-00942: テーブルまたはビューが存在しない]OLE DB エラー トレース [OLE/DB Provider 'MSDAORA' IOpenRowset::OpenRowset returned 0x80040e37: 指定されたテーブルが存在しません。]。
エラー 7312: リンク サーバー "%ls" の OLE DB プロバイダー '%ls' のスキーマまたはカタログの使用が無効です。 4 部構成の名前が指定されましたが、プロバイダーはカタログやスキーマを使用するために必要なインターフェイスを公開しません。
エラー 7313: リンク サーバー "%ls" のプロバイダー "%ls" に無効なスキーマまたはカタログが指定されました。
エラー 7314: リンク サーバー "%ls" の OLE DB プロバイダー "%ls" にテーブル "%ls" が含まれていません。 テーブルが存在しないか、現在のユーザーにそのテーブルに対する権限がありません。
これらのエラー メッセージを受け取った場合、Oracle スキーマにテーブルが見つからないか、そのテーブルに対するアクセス許可がない可能性があります。 スキーマ名が大文字で入力されていることを確認します。 テーブルと列のアルファベット順の大文字と小文字は、Oracle システム テーブルで指定されているとおりにする必要があります。
Oracle 側では、二重引用符なしで作成されたテーブルまたは列が大文字で格納されます。 テーブルまたは列が二重引用符で囲まれている場合、テーブルまたは列はそのまま格納されます。
次の呼び出しは、Oracle スキーマにテーブルが存在するかどうかを示しています。 この呼び出しでは、正確なテーブル名も表示されます。
sp_tables_ex @table_server=Ora817Link, @table_schema='your_schema_name'
メッセージ 6
エラー 7413: リンク サーバー '%ls' に接続できませんでした (OLE DB プロバイダー '%ls')。 権限の委譲を有効にするか、現在のユーザーのリモート SQL Server ログインを使用してください。 ユーザー '' のメッセージ 18456、レベル 14、状態 1、行 1 のログインに失敗しました。
このエラー メッセージは、明示的なログイン マッピングなしで、Microsoft Windows 認証ログインに対して分散クエリが試行されていることを示します。 セキュリティ委任がサポートされていないオペレーティング システム環境では、Windows NT 認証ログインには、
sp_addlinkedsrvlogin
を使用して作成されたリモート ログインとパスワードへの明示的なマッピングが必要です。メッセージ 7
エラー 7391: リンク サーバー "%ls" の OLE DB プロバイダー 'MSDAORA' が分散トランザクションを開始できなかったため、操作を実行できませんでした。 OLE DB エラー トレース [OLE/DB Provider 'MSDAORA' ITransactionJoin::JoinTransaction returned 0x8004d01b]
この記事で前述したように、OCI バージョンが正しく登録されていることを確認します。
注
レジストリエントリがすべて正しい場合は、MtxOCI.dllファイルが読み込まれます。 MtxOCI.dll ファイルが読み込まれていない場合、Microsoft OLE DB Provider for Oracle または Microsoft ODBC Driver for Oracle を使用して、Oracle に対して分散トランザクションを実行することはできません。 サード パーティのプロバイダーを使用していて、エラー 7391 が表示される場合は、使用している OLE DB プロバイダーが分散トランザクションをサポートしていることを確認します。 OLE DB プロバイダーが分散トランザクションをサポートしている場合は、Microsoft 分散トランザクション コーディネーター (MSDTC) が実行されており、 network アクセスが有効になっていることを確認します。
メッセージ 8
エラー 7392: リンク サーバー "%ls" の OLE DB プロバイダー 'MSDAORA' のトランザクションを開始できません。 OLE DB エラー トレース [OLE/DB Provider 'MSDAORA' ITransactionLocal::StartTransaction returned 0x8004d013: ISOLEVEL=4096]。
このセッションでアクティブにできるトランザクションは 1 つだけであるため、OLE DB プロバイダーからエラー 7392 が返されました。 このエラーは、接続が明示的または暗黙的なトランザクションにあり、OLE DB プロバイダーが入れ子になったトランザクションをサポートしていない場合に、OLE DB プロバイダーに対してデータ変更ステートメントが試行されていることを示します。 SQL Server では、特定のエラー条件で、トランザクションを続行しながらデータ変更ステートメントの効果を終了できるように、このサポートが必要です。
SET XACT_ABORT
が ON の場合、SQL Server では OLE DB プロバイダーからの入れ子になったトランザクションのサポートは必要ありません。 したがって、暗黙的または明示的なトランザクション内のリモート テーブルに対してデータ変更ステートメントを実行する前に、SET XACT_ABORT ON
を実行します。 これを行うには、使用している OLE DB プロバイダーが入れ子になったトランザクションをサポートしていない場合に行います。
Oracle サーバーへの接続の問題をトラブルシューティングする手法
Oracle 用 Microsoft ODBC ドライバーまたは Microsoft OLE DB Provider for Oracle のいずれかで Oracle 接続の問題をデバッグするには、次の手順に従います。
Oracle SQL Plus ユーティリティ (コマンド ライン ベースのクエリ ユーティリティ) を使用して、Oracle に接続してデータを取得できることを確認します。
注
Oracle に接続してデータを取得できない場合は、Oracle クライアント コンポーネントのインストールまたは構成が正しくないか、SQL*Net Easy Configuration ユーティリティまたは Oracle Net8 Easy Configuration ユーティリティを使用したときに Oracle サーバーの Transparent Network Substrate (TNS) サービス エイリアスが正しく作成されていません。 Oracle データベース管理者 (DBA) に問い合わせて、必要な Oracle コンポーネントが正しくインストールおよび構成されていることを確認してください。
コンピューターにインストールされている Oracle クライアント (SQL*Net バージョン) のバージョンを確認します。 Microsoft ODBC Driver for Oracle と Microsoft OLE DB Provider for Oracle の両方で、クライアント コンピューターに SQL*Net バージョン 2.3 以降をインストールする必要があります。
SQL Plus (Oracle クライアント クエリ ツール) からの接続は機能しているように見えるかもしれませんが、ODBC/OLE DB 接続が正しく機能するにはコンピューターを再起動する必要があります。
注
Oracle 8i を使用すると、.rgs ファイルは空になります。
Oracle クライアントがインストールされていて、Oracle クライアント コンポーネント 7.3 以降をコンピューターにインストールする必要があることを示すエラーが表示された場合は、クライアント コンピューターの環境変数 PATH に、Oracle クライアントがインストールされたフォルダー ( Oracle_Root\Bin など) が含まれていることを確認します。 このフォルダーが見つからない場合は、PATH 変数にフォルダーを追加してエラーを解決します。
Ociw32.dll ファイルが Oracle_Root\bin フォルダーにあることを確認します。 この.dll ファイルは、クライアント コンピューター上の他の場所には存在できません。 Oracle クライアント コンポーネント DLL (Core40.dll ファイルや Ora*.dll ファイルなど) が、 Oracle_Root フォルダーまたはサブフォルダーの外部に存在しないことを確認します。
コンピューターに 1 つの Oracle クライアント バージョンがインストールされていることを確認します。 同じクライアント コンピューターに複数のバージョンの SQL*Net を存在させることはできません。これは、干渉や重要な操作 (TNS やエイリアス参照など) を伴います。
お使いのコンピューターにリモート Oracle クライアントをマッピングし、システムのパスに含め、ODBC/OLE DB 経由で Oracle に接続することで、Oracle クライアントをローカルにインストールしないことをお勧めします。 ただし、プロバイダーとドライバーは、ネットワーク共有ではなく、ローカルにインストールされた Oracle クライアントでテストされます。