唐突ですが連携系。
新機能といいつつ、実は9iぐらいから標準搭載の機能でGeneric Connectivityというものがありました。
11gR1からこれがOracle Database Gateway for ODBCという名称に変更になり旧称Oracle Transparent Gatewayとともにれっきとしたデータベースゲートウェイの一員となりました。
なお、無償で利用可能です。
機能を解説すると、ま、名前のとおりではあるんですがODBCを使ってデータベースアクセスをするゲートウェイですが・・・
1.Oracle Database側からSQLでシームレスにアクセスできる!
2.ODBCでつながるデータベース/データソースならなんでもアクセス!
というものです。
SQLベースのアクセスができるのでデータベースな人なら扱いやすいかもしれません。
また、11gR1からはDatabaseとは別に導入することが可能になったので別サーバーなどで導入することができます。
構成図としては以下のとおり。
では、セットアップを。
ではGatewayの導入から。
GatewayはDatabase メディアパック「Oracle® Database Gateways 11g Release 1 (11.1.0.6.0) for Microsoft Windows (32-bit) CD」
もしくはedelivery.oracle.comから入手してください。
導入元からSetup.exeから起動します。
今回は、D:\oracle\product\11.1.0\tg_1 というディレクトリに導入しています。
続いて、連携する側のPostgreSQLのデータソースを設定します。
細かい設定の説明はさけますが、試した環境では文字コードの対応のために、PostgreSQL ANSIドライバが必要でした。
続いて、中間でゲートウェイをする設定を行います。
Gateway側の設定
1. Listenerの設定
- Gatewayはリスナとして起動します。
listener.oraを編集します。
これは、D:\oracle\product\11.1.0\tg_1\NETWORK\ADMINにあります。
この中、今回の環境では同一サーバーにあるListenerと競合をさけるため、"PORT=1522"を指定しています。
また、特殊なところとして対応するGWのSIDとしてHOGEHOGE、PROGRAMにdg4odbcを記載してあります。
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=HOGEHOGE)
(ORACLE_HOME=D:\oracle\product\11.1.0\tg_1\)
(PROGRAM=dg4odbc)
)
)
2. HSの設定
続いて、SID=HOGEHOGEに対するGWサービスをつくります。
この設定はD:\oracle\product\11.1.0\tg_1\hs\adminにあるinitdg4odbc.oraというサンプルファイルをinit
今回の場合はHOGEHOGEなのでinitHOGEHOGE.oraです。
中身としては、スクリーンショットのとおりですが
HS_FDS_CONNECT_INFO = hogehoge
と記述しています、このhogehogeはODBCドライバに設定したDSN名です。
3. 起動
次にGatewayのListnerを起動しましょう。
Windowsサービスから起動します。
4. Database側の設定
GWを呼び出すデータベースのほうから接続可能なようにtnsnames.oraを設定します。
GWはリモートのオラクルにみえているのでLisenしているポートとサービスしているTNS名を指定するだけです。
*この設定はGWではなくDBの方を設定してます。
D:\app\mmatsuza\product\11.1.0\db_1\NETWORK\ADMIN\tnsnames.ora
hogehoge =
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=mmatsuza-jp2)
(PORT=1522)
)
(CONNECT_DATA=
(SID=HOGEHOGE))
(HS=OK))
ここでのポイントはPORT=1522, HS=OK, SID=HOGEHOGEの3つの設定です。
5.動作確認
対Oracleに対するDBLINKの作成とにてます。
試してみますと、以下のような感じです。
解説すると、以下のようになります。
create public database link "<DBLINK名>" connect to "<ODBC接続ユーザー名>" identified by "<ODBC接続ユーザーパスワード>" using '<tnsnames記載のGW/サービス名>';
サービス名のクォートが'であるところが注意!
3.実行確認
では、実行してみます。
SELECT * FROM "<リモートテーブル名>"@<DBLINK名>
と、検索を実行してます。ポイントはリモートテーブル名を"でクォートしてます。
ためしたPostgreSQLはケースセンシティブなので入れておかないとエラーになったり
します。いれないとUpper Caseでなげちゃうので。
以上で利用可能です。
次回は実際の利用について検証します。