はじめに
本記事では、SQL Server(64bit)から Oracle 11g(32bit)に対してリンクサーバー経由でアクセスする方法を模索し、最終的にうまく接続・データ取得まで至った一連の流れを備忘録としてまとめました。
同じように移行・接続で悩まれている方の一助となれば幸いです。
背景
・Windows Server2008 R2をまだ使ってた。
・SQLServerからOracleへリンクテーブルを貼って利用していた。
・Oracleは32bit 11g
・新環境はWindows 2022Server。別アプリの兼ね合いでOracle Clientは11gの32bitを入れておかなければならい状態
・新環境のSQLServerからOracle11gに今まで同様、リンクテーブルを貼らなければならないが、設定できなくなっていた。
直面した課題
- SQL Server(64bit)と Oracle 11g(32bit) のアーキテクチャ不一致
- MSDAORA を使用しても
RegSvr32
登録不可(依存関係やDLL初期化失敗)
→MSDAORA 経由が廃止になっていた? - Oracle 32bit Client のみが既存アプリに必要で、64bit Client を導入できない
- ODBC(32bit)は作成できたが、SQL Server からリンクできない
MSDASQL
経由では DSN アーキテクチャの不一致で 7303 エラー
🧭 取った対策の方針
① 別の SQL Server を経由した中継構成に変更
- Oracle 19c Client(64bit)を別のサーバーに導入
- そこから ODBC を経由して Oracle 11g(32bit)に接続成功
- そのサーバーに SQL Server から Oracle へのリンクサーバー を構築
- 最終的に、目的のサーバー①から②経由で Oracle に間接アクセス
🔧 環境構成
機能 | 内容 |
---|---|
Oracle DB | Oracle 11g(32bit) |
中継SQL Server | SQL Server 2019 + Oracle 19c Client(64bit) |
最終目的のSQL Server | SQL Server 2019(変更不可) |
✅ 中継サーバーでのリンクサーバー構築
- Oracle 19c Client(64bit)をインストール
- SQL Server に以下のようにリンクサーバーを作成:
EXEC sp_addlinkedserver
@server = N'LINK_TO_ORA',
@provider = N'MSDASQL',
@srvproduct = N'Oracle',
@datasrc = N'MY_ORACLE_DSN';
EXEC sp_addlinkedsrvlogin
@rmtsrvname = N'LINK_TO_ORA',
@useself = N'False',
@rmtuser = N'username',
@rmtpassword = N'password';
📥 SQL Server 側からのアクセス方法
直接以下のようにアクセスは不可:
SELECT * FROM [LINK_TO_ORA]..[SCHEMA].[TABLE]; -- ❌ 7318エラーなど
代替策:OPENQUERY を使用し、明示的にカラムを指定する
SELECT
COLUMN1,
COLUMN2,
...
FROM OPENQUERY(LINK_TO_ORA, 'SELECT COLUMN1, COLUMN2, ... FROM SCHEMA.TABLE')
これは、Oracle側のデータ型変換で 列定義が無効
となる問題(7318エラー)を防ぐための重要ポイントでした。
🧩 Viewによる安定運用
毎回 OPENQUERY
で直接カラムを列挙するのは面倒なため、中継サーバー側にビュー(View)を作成し、それを経由することで可読性と保守性が向上しました。
CREATE VIEW vw_ProductMaster AS
SELECT
COLUMN1,
COLUMN2,
...
FROM OPENQUERY(LINK_TO_ORA, 'SELECT COLUMN1, COLUMN2, ... FROM SCHEMA.TABLE')
その後、目的のSQL Serverからは以下のようにシンプルに参照可能:
SELECT * FROM LINK_TO_SQL.DBNAME.dbo.vw_ProductMaster;
🔗 目的サーバーからのアクセス
中継SQL Serverにリンクサーバーを作成:
EXEC sp_addlinkedserver
@server = N'LINK_TO_SQL',
@provider = N'SQLNCLI',
@datasrc = N'HOSTNAME\INSTANCE';
このリンクサーバーを経由して、以下のようにOracleデータを参照:
SELECT *
FROM OPENQUERY(LINK_TO_SQL, '
SELECT COLUMN1, COLUMN2 FROM OPENQUERY(LINK_TO_ORA,
''SELECT COLUMN1, COLUMN2 FROM SCHEMA.TABLE''
)
')
💡 トラブルと解決
エラー内容 | 対応策 |
7303 / アーキテクチャ不一致 | DSN(64bit)で作成すること / SQL Serverは64bit前提 |
7318 / 無効な列定義 | SELECT * ではなく 明示的なカラム指定で対応 |
フリーズやSSMSクラッシュ | Oracle Provider for OLE DB をGUIで選択しない(要注意) |
📝 まとめ
- Oracle 11g(32bit)への直接リンクが取れない環境でも、中継SQL Server構成で回避できる
OPENQUERY
+ 明示カラム指定が安定の鍵- GUIでの設定は便利だが、View登録・プロバイダー選択には細心の注意が必要
- 中継サーバーの稼働状況、パフォーマンスにも若干影響?
トラブル時はエラー番号でしっかり検索・分解し、焦らずに一つずつ分離して検証することが成功の近道でした。
コメント