SQL Server から Oracle へのリンクサーバー設定で、Oracle Provider for OLEDB を インプロセスとしてリンクサーバーを設定すると、SQL Server プロセスのメモリ空間内にOracle Provider for OLEDB の DLLがロードされ、 SQL Server プロセスが不正にダウンするなどの現象が発生する可能性があります。
そのため、アウトプロセスとして設定することが推奨されています。
今回は、Oracle Provider for OLEDB をアウトプロセスとしてリンクサーバーを設定するための手順を紹介したいと思います。
[今回の構成]
リンクサーバー元 : SQL Server 2019
リンクサーバー先 : Oracle 12C R2 (12.2.0.1.0)
事前準備
SQL Server がインストールされた環境に Oracle Data Access Compornents (ODAC) をインストールします。
1) 以下の URL から、Oracle Data Access Compornents (ODAC) をダウンロードします。
※ 今回は、「64-bit ODAC 12.2c Release 1 (12.2.0.1.0) Xcopy for Windows x64 (ODAC122010Xcopy_x64.zip )」をダウンロードします。
2) ODAC (Oracle Data Access Compornents) の圧縮ファイルを任意のフォルダに展開します。
※ 今回は、C:\Temp\ODAC122010Xcopy_x64 に展開します。
3) コマンド プロンプトを起動し、2)で展開したパスに移動し、install.bat を実行し、oledb コンポーネントをインストールします。
>install.bat oledb <Oracle ホームパス> <Oracle ホーム名> true
[コマンド例]
C:\temp\ODAC122010Xcopy_x64>install.bat oledb c:\oracle myhome true
[補足]
SQL Plus ツールなども一緒にインストールする必要がある場合は、「ODAC122011_x64.zip」 をダウンロードし、GUI から Oracle Client をインストールします。
4) リンクサーバー接続先のOracleへ接続できるよう、「tnsnames.ora」、「sqlnet.ora」を修正します。
+ tnsnames.ora 設定例
SV1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = *********)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ***********) ) ) |
+ sqlnet.ora 設定例
SQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) |
Oracle Provider for OLEDB をアウトプロセスとしてリンクサーバーを設定するための手順
アクセス権の設定
1) [スタート] - [管理ツール] - [コンポーネント サービス] を起動します。
2) [コンポーネント] - [コンピュータ] - [マイ コンピュータ] - [DCOMの構成]を選択し、右ペインの「MSDAINITIALIZE」- 右クリック - [プロパティ] を選択します。
3) セキュリティ タブ - [起動とアクティブ化のアクセス許可] - [カスタマイズ] - [編集] を選択します。
4) [追加] を選択し、 SQL Server サービス起動アカウントに指定された Windows ユーザー アカウントを追加後、すべての項目の「許可」へチェックし、[OK] を選択します。
5) セキュリティ タブ - [構成のアクセス許可] - [カスタマイズ] - [編集] を選択します。
6) [追加] を選択し、SQL Server サービス起動アカウントに指定された Windows ユーザー アカウントを追加後、フルコントロールの「許可」へチェックし、[OK] を選択します。
7) [適用] を押下後、[OK] を選択し、MSDAINITIALIZEのプロパティ画面を閉じます。
レジストリの変更手順
1) [スタート] ボタン、検索プログラムおよびファイルボックスに「regedit」と入力後、[レジストリ エディタ] を選択し、レジストリ エディタを起動します。
2) 次のサブキーを見つけます。
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{2206CDB0-19C1-11D1-89E0-00C04FD7A829}
2) 次の レジストリ キーを見つけます。
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{2206CDB0-19C1-11D1-89E0-00C04FD7A829}
3) {2206CDB0-19C1-11D1-89E0-00C04FD7A829} を右クリックし、[アクセス許可] を選択します。
4) [詳細設定] ボタンを押下しセキュリティの詳細を開きます。
5) [所有者] - [変更] を選択します。
6) 「SQL Server サービス起動アカウントに指定された Windows ユーザー アカウント」を選択し、[OK] ボタンを選択します。
7) 「SQL Server サービス起動アカウントに指定された Windows ユーザー アカウント」および「Administrators」に対して、[フル コントロール] の [許可] にチェックし、[適用]を押下後、[OK] を選択します。
8) レジストリ エディターを終了します。
9) 設定を反映させるため、OSの再起動を実施します。
参考情報
Oracle リンクサーバー作成手順
1) SQL Server Management Studio (SSMS) を起動し、管理者権限(sysadmin)が付与されたログイン (sa など) で該当インスタンスに接続します。
2) 「サーバー オブジェクト」-「リンクサーバー」-「プロバイダー」-「OraOLEDB.Oracle」- 右クリック - 「プロパティ」を選択します。
3) 「InProcess 許可」の「有効化」のチェックを外し、「OK」 を選択します。
※ 「InProcess 許可」のチェックを外すことで、Oracle Provider for OLEDB をアウトプロセスとして動作させることが可能となります。
4) 「サーバー オブジェクト」-「リンクサーバー」- 右クリック -「新しいリンク サーバー」を選択します。
5) ページの選択 :「全般」の右ペインで、以下のように設定します。
リンク サーバー名 : 任意の名前 (今回は「ORA」)
サーバーの種類 :「その他のデータソース」
プロバイダー :「Oracle Provider for OLE DB」
製品名 :「Oracle」
データソース :「<ホスト名 or IP アドレス>:<Oracleリッスンポート番号>/<SERVICE_NAME>」
[データソース例] (tnsnames.ora から設定値を確認)
10.0.0.2:1521/db1.az.com
6) ページの選択 :「セキュリティ」の右ペインで、「このセキュリティ コンテキストを使用する」を選択し、リンクサーバー先の Oracle への接続するためのログイン設定を「リモート ログイン」、「パスワード」欄に入力します。
7) ページの選択 :「サーバー オプション」の右ペインで、以下の項目を「True」に変更後、「OK」を選択します。
データ アクセス : True
RPC : True
RPC 出力 : True
リモート照合順序を使用 : True
8) SQL Server Management Studio (SSMS) から [リンクサーバー名]..[スキーマ名].[オブジェクト名] に対してクエリを実行し、結果を取得できることを確認します。
まとめ
今回は、Oracle Provider for OLEDB をアウトプロセスとしてリンクサーバーを設定するための手順を紹介してみました。
SQL Server から Oracle へのリンクサーバーを新規で設定する機会は少ないかもしれませんが、既存の環境で Oracle Provider for OLEDB を インプロセスとしてリンクサーバーを設定することで、SQL Server プロセスが不正にダウンするという現象が発生している場合は、アウトプロセスとして設定することを検討されてみると良いかと思います。