SQL Server から Oracle(32bit)へリンクサーバー接続するまでの備忘録

はじめに

本記事では、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(変更不可)

✅ 中継サーバーでのリンクサーバー構築

  1. Oracle 19c Client(64bit)をインストール
  2. 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登録・プロバイダー選択には細心の注意が必要
  • 中継サーバーの稼働状況、パフォーマンスにも若干影響?

トラブル時はエラー番号でしっかり検索・分解し、焦らずに一つずつ分離して検証することが成功の近道でした。

 

コメント

タイトルとURLをコピーしました