はじめに
Oracleクライアント(ODP.NET)のバージョン違いを複数クライアントPCにインストールした際、どのOracle Homeにあるtnsnames.oraを使ってサービス名を解決しているのかが分からなく場合がある。
この記事では、どのtnsnames.oraが利用されているかを、各種設定情報を頼りに読み解く方法を解説しようと思う。
ただし、記事の内容は経験則で書かれているため、公式資料に基づいた内容ではない。その点は留意しておいてほしい。
Oracleクライアントをインストールした時のOracle Homeとレジストリの状態
初めてPC上にOracleクライアントをインストールした場合、デフォルトではCドライブ直下に以下のようなOralce Homeのフォルダが作製される。
同時にレジストリにもOracleの設定情報が書き込まれていることが確認できる。
Oracleクライアントを複数回インストールするとどうなるか
既にOracleクライアントがインストールされている環境に新しくOracleクライアントをインストールすると、フォルダ構成は以下のような状態になる。
レジストリにも新しく、Oracle Homeが追加されていることがわかる。
DLLはどこを指定しているか?
複数のOracle Homeが存在する状態でも、レジストリにはひとつのODP.NETしか登録されていない。
この配下にある.NET Framework 4+の構成(4.122.19.1)にDllPathというキーが存在している。
この値は"依存する非管理Oracle Clientバイナリのロード元を指定"を指定しているが、ここでいずれかのOracle Homeのbinフォルダが指定されているはずである。
binフォルダにはOracle.Keyというファイルが存在しているが、その中身は以下ような内容である。
SOFTWARE\ORACLE\KEY_OraClient19Home2
つまり、レジストリに定義されているどのOracle Homeを見に行くべきかが書かれていて、その配下のtnsnames.oraファイルを用いてサービス名を解決しているようである。
実際に以前試したところでは、この値をもう一つのOracle Homeの値に変更すると、そちらのtnsnames.oraが優先されることが確認できた。
環境変数で強制的に指定する方法
ここまで、どのtnsnames.oraを見ているのかを確認する方法を書いてきたが、実は強制的に見に行くtnsnames.oraを指定する方法がある。
その環境変数はTNS_ADMINである。TNS_ADMIN環境変数の値に、利用したいtnsnames.oraファイルの存在するフォルダパスを定義することで、レジストリの値に関わらずそのファイルを利用するように指定することできる。
参考サイト
https://www.shift-the-oracle.com/oracle-net/tnsnames.html
http://www.dba-oracle.com/t_windows_tnsnames.ora_file_location.htm
https://winofsql.jp/VA003334/infoboard_page.php?mid=oracle&id=040205003135