SQL Serverでリンク サーバーを Oracle データベースにセットアップしてトラブルシューティングする

この記事では、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 Server2005 ワークグループ エディション
元の KB 番号: 280106

概要

この記事では、Microsoft SQL Serverを実行しているコンピューターから Oracle データベースにリンク サーバーを設定する方法と、Oracle にリンク サーバーを設定するときに発生する可能性がある一般的なエラーに関する基本的なトラブルシューティング手順について説明します。 この記事のほとんどの情報は、Microsoft OLEDB Provider for Oracle (MSDAORA) を使用するように構成されている環境に適用されます。 新しい開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションを変更する予定です。 代わりに、Oracle の OLE DB プロバイダーを使用します。

Oracle の OLEDB プロバイダーを使用してリンク サーバーを構成する方法の詳細については、「 Oracle とリンク サーバーを使用して起動して実行する方法」を参照してください。

重要

現在のバージョンの Microsoft ODBC Driver for Oracle は ODBC 2.5 仕様に準拠していますが、OLE DB Provider for Oracle はネイティブの Oracle 7 OCI API プロバイダーです。 ドライバーとプロバイダーはどちらも、SQL*Net クライアント (または Oracle 8x の場合は Net8 クライアント) と Oracle 呼び出しインターフェイス (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 にリンク サーバーを設定する手順

  1. リンク サーバーがセットアップされているSQL Server実行されているコンピューターに Oracle クライアント ソフトウェアをインストールする必要があります。

  2. SQL Serverを実行しているコンピューターに目的のドライバーをインストールします。 Microsoft では、Microsoft OLE DB Provider for Oracleと Microsoft ODBC Driver for Oracle のみがサポートされています。 サード パーティのプロバイダーまたはサード パーティ製ドライバーを使用して Oracle に接続する場合は、プロバイダーまたはドライバーを使用して発生する可能性がある問題について、各ベンダーに問い合わせる必要があります。

  3. 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"
      
  4. Oracle クライアント ソフトウェアをインストールした後、SQL Server実行されているコンピューターを再起動します。

  5. 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 サーバーエイリアスを使用します。 詳細については、「オンライン ブック」の「sp_addlinkedserver」トピックSQL Server参照してください。

一般的なエラー メッセージとそのトラブルシューティング方法

重要

このセクション、方法、またはタスクには、レジストリの編集方法が記載されています。 レジストリを誤って変更すると、深刻な問題が発生することがあります。 レジストリを変更する際には十分に注意してください。 保護を強化するため、レジストリを変更する前にレジストリをバックアップします。 こうしておけば、問題が発生した場合にレジストリを復元できます。 レジストリをバックアップおよび復元する方法の詳細については、次の記事番号をクリックして、「Microsoft サポート技術情報: Windows でレジストリをバックアップおよび復元する方法 」322756 の記事を参照してください

次の 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:not resolve service name"

  • メッセージ 2b

    "Oracle(tm) クライアントとネットワーク コンポーネントが見つかりませんでした。 これらのコンポーネントは Oracle Corporation によって提供され、Oracle バージョン 7.3.3 (またはそれ以上) のクライアント ソフトウェア インストールの一部です"

    これらのエラーは、Oracle サーバーへの接続に問題がある場合に発生します。 追加 のトラブルシューティングについては、以下の「Oracle サーバーへの接続の問題をトラブルシューティングする手法 」セクションを参照してください。

  • メッセージ 3

    エラー 7302: リンク サーバー "%ls" の OLE DB プロバイダー 'MSDAORA' のインスタンスを作成できません。

    MSDAORA.dll ファイルが正しく登録されていることを確認します。 (MSDAORA.dll ファイルは、Oracle ファイル用の Microsoft OLE DB プロバイダーです)。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) を使用するプロバイダーの [インプロセスを許可する] オプションを設定します。

    1. SSMS を開き、SQL Server インスタンスに接続します。
    2. オブジェクト エクスプローラーで、[サーバー オブジェクト>] [リンク サーバー プロバイダー]> の順に移動します
    3. 構成するプロバイダーを右クリックし、[プロパティ] を選択 します
    4. [プロバイダー オプション] ウィンドウで、[インプロセスを許可する] オプションの [有効] ボックスをチェックします。
  • メッセージ 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 プロバイダー 'MSDAORA' IOpenRowset::OpenRowset から返された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 プロバイダー '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) が実行されており、 ネットワーク アクセスが有効になっていることを確認します。

  • メッセージ 8

    エラー 7392: リンク サーバー "%ls" の OLE DB プロバイダー 'MSDAORA' のトランザクションを開始できません。 OLE DB エラー トレース [OLE/DB プロバイダー 'MSDAORA' ITransactionLocal::StartTransaction が0x8004d013返されました: ISOLEVEL=4096]。

    このセッションでアクティブにできるトランザクションは 1 つだけであるため、OLE DB プロバイダーからエラー 7392 が返されました。 このエラーは、接続が明示的または暗黙的なトランザクションにあり、OLE DB プロバイダーが入れ子になったトランザクションをサポートしていない場合に、OLE DB プロバイダーに対してデータ変更ステートメントが試行されていることを示します。 SQL Serverは、特定のエラー条件で、トランザクションを続行しながらデータ変更ステートメントの効果を終了できるように、このサポートを必要とします。

    ON の場合SET XACT_ABORT、SQL Server OLE DB プロバイダーからの入れ子になったトランザクションのサポートは必要ありません。 したがって、暗黙的または明示的なトランザクション内のリモート テーブルに対してデータ変更ステートメントを実行する前に を実行 SET XACT_ABORT ON します。 使用している OLE DB プロバイダーが入れ子になったトランザクションをサポートしていない場合は、これを行います。

Oracle サーバーへの接続の問題をトラブルシューティングする手法

Microsoft ODBC ドライバー for Oracle または Microsoft OLE DB Provider for Oracleで Oracle 接続の問題をデバッグするには、次の手順に従います。

  1. Oracle SQL Plus ユーティリティ (コマンド ライン ベースのクエリ ユーティリティ) を使用して、Oracle に接続してデータを取得できることを確認します。

    注:

    Oracle に接続してデータを取得できない場合は、Oracle クライアント コンポーネントのインストールまたは構成が正しくないか、SQL*Net Easy Configuration ユーティリティまたは Oracle Net8 Easy Configuration ユーティリティを使用したときに Oracle サーバーの Transparent Network Substrate (TNS) サービス エイリアスが正しく作成されていません。 Oracle データベース管理者 (DBA) に問い合わせて、必要な Oracle コンポーネントが正しくインストールおよび構成されていることを確認してください。

  2. コンピューターにインストールされている Oracle クライアント (SQL*Net バージョン) のバージョンを確認します。 Oracle 用 Microsoft ODBC ドライバーとMicrosoft OLE DB Provider for Oracleの両方で、クライアント コンピューターに SQL*Net バージョン 2.3 以降をインストールする必要があります。

    SQL Plus (Oracle クライアント クエリ ツール) からの接続が機能しているように見えるかもしれませんが、ODBC/OLE DB 接続が正しく機能するには、コンピューターを再起動する必要があります。

    注:

    Oracle 8i を使用すると、.rgs ファイルは空になります。

  3. Oracle クライアントがインストールされていて、Oracle クライアント コンポーネント 7.3 以降をコンピューターにインストールする必要があることを示すエラーが表示される場合は、クライアント コンピューターの環境変数 PATH に、Oracle クライアントがインストールされたフォルダー ( Oracle_Root\Bin など) が含まれていることを確認します。 このフォルダーが見つからない場合は、PATH 変数にフォルダーを追加してエラーを解決します。

  4. Ociw32.dll ファイルが Oracle_Root\bin フォルダーにあることを確認します。 この .dll ファイルは、クライアント コンピューター上の他の場所に存在できません。 Oracle クライアント コンポーネント DLL (たとえば、Core40.dll ファイルと Ora*.dll ファイル) が 、Oracle_Root フォルダーまたはサブフォルダーの外部に存在しないことを確認します。

  5. 1 つの Oracle クライアント バージョンがコンピューターにインストールされていることを確認します。 SQL*Net の複数のバージョンを同じクライアント コンピューターに存在することはできません。これは、重要な操作 (TNS やエイリアス参照など) に干渉し、影響を与えます。

  6. Microsoft では、Oracle クライアントのローカル インストールを行うことをお勧めします。これを行うには、コンピューター上のリモート Oracle クライアントをマッピングし、システムのパスに含め、ODBC/OLE DB 経由で Oracle に接続することをお勧めします。 ただし、プロバイダーとドライバーは、ネットワーク共有ではなく、ローカルにインストールされた Oracle クライアントでテストされます。

関連項目