2013年1月10日木曜日

OracleからSqlServerへ接続する

OracleからSqlServerへ接続する方法をまとめ。基本的にはODBCデータソースとDBLinkを使用する。イメージ的には、 SqlServer -> ODBCデータソース -> DBLink -> Oracle という形になる。

1.ODBCデータソースの登録
コントロールパネル > 管理ツール > データ ソース (ODBC) を選択。
ここでデータソースの追加ボタンを押し、SqlServerかSqlServerNativeClientのどちらかでデータソースを作成する。
接続するサーバーは サーバー名(IPアドレス)\インスタンス名 が基本だが、サーバー名だけでも良いようだ。SqlServerでインスタンスを作成すると自動的に作成されるようなので、SqlServerを立てている側のサーバーのデータソース設定を見ると正確。

他のログイン設定は、適宜設定。


2.Oracle Database Gatewayの登録
ORACLE_HOME\hs\admin のフォルダにDatabaseGatewayの設定ファイルがある。
ファイル名は init<SID>.ora とする。SIDは任意の名称。dg4・・・とするのが慣例?のようだ(dgはDatabaseGatewayの略と思われる)。

内容は以下の通り。

HS_FDS_CONNECT_INFO = <odbc data_source_name>
HS_FDS_TRACE_LEVEL = <trace_level>

<odbc data_source_name>は先ほど作成したデータソース名、<trace_level>はOFFかONを設定。ONにしておくとoracle_home:[tg4rdb.log].にログを書き出してくれるので、ONにしておくのを推奨。


3.リスナーへの登録
OracleのリスナーにGatewayを登録する。ORACLE_HOME\network\admin にあるlistener.oraにGateway用の以下の記述を追記。

SID_LIST_LISTENER=
   (SID_LIST=
      (SID_DESC= 
         (SID_NAME=gateway_sid)
         (ORACLE_HOME=oracle_home_directory)
         (PROGRAM=dg4odbc)
      )
   )

gateway_sidは2で設定したSID(ファイル名の一部)。oracle_home_directoryはoracle_homeの値となる。

この設定を終えたのち、リスナーの再起動を行う。
※一度リスナーの再起動に失敗したことがあった。プロセスを見てみるとODBCデータソースがリスナーが起動するのに必要なポートを占有していたようなので、これを切ったところうまく立ち上がった(普通に起きる出来事なのかは定かでない・・・)。


4.接続名の登録
listener.oraと同フォルダにあるtnsnames.oraで定義されているOracleの接続名に追記を行う。

SQL_SRV=
   (DESCRIPTION=
    (ADDRESS= (PROTOCOL=TCP)(HOST=odbc_data_source_host)(PORT=1521))
    (CONNECT_DATA=(SID=gateway_sid))
    (HS=OK)
)

ホスト名が、相手先のSqlServerのホストでなく、ODBCデータソースのホスト(要するに自サーバー)である点に注意。


5.DBLinkの登録
ここまでくればあと一歩である。
以下のコマンドでDBlinkを作成する。なお、作成にはCREATE DATABASE LINK関連の権限が必要なため注意(こちら参考)。

CREATE PUBLIC DATABASE LINK dblink_name CONNECT TO user_name IDENTIFIED BY password USING 'service_name';

サービス名は文字列としてシングルクォーテーションでくくらないといけない点に注意。PUBLICをつけるかどうかは場合によりけり。

これでDBLINKの作成が完了したので、以下のSQL文で動作確認を行う。

select 'X' from dual@dblink_name

これで出力が返ってくれば完成!である。


※一度相手先のSqlServerがとまっていたことがあり、このときOracle側のリスナーも起動が失敗した。再現実験ができていないのだが、もしかしたらリスナー起動時にGatewayの生死判定があり、相手先が止まっていた場合自分も起動しないという迷惑判定があるかもしれないので要注意。


<参考>
Configuring Oracle Database Gateway for ODBC

D Heterogeneous Services Initialization Parameters



0 件のコメント:

コメントを投稿