SQL Server 向け ODBC ドライバー/OLE DB プロバイダー移行のススメ

Last Update:
このエントリーをはてなブックマークに追加

こんにちは、Japan Developer Support Core チームの高橋です。前回の "Jet データベースエンジンの移行のススメ" に続くレガシーなデータ アクセス テクノロジーの移行のススメ第 2 弾です。

SQL Server に接続する既存アプリケーションの中には、Windows OS 同梱の SQL Server ODBC Driver (SQLSRV32)OLE DB Provider for SQL Server (SQLOLEDB) または、SQL Server 2005 より左記の後継として提供開始された SQL Server Native Client (SQLNCLI) を今も使用している様子を各種お問い合わせで確認しています。その主な理由としては・・・

  • 長年問題なく動いている
  • 当時の開発者不在につきコードを触れないため変えたくない
  • 追加のインストールを避け、OS に含まれるコンポーネントを使用したい

特に日本では開発作業は他社に依頼して成果物のみを受け取って運用、その後の保守も動いている限りは不要であるなど、いざメンテナンスということがなければ開発に相当する作業に誰も手を出せない状態に陥るケースがそこそこあるのが現実のようです。

しかし、だからといってこれらの古いデータ アクセス コンポーネントを使用することにおけるリスクについてはいかがでしょうか。セキュリティについては基本前提として DX や AI などと言われる現在、本当にそのまま運用していていいのでしょうか。

これらの傾向を踏まえ、今回は SQL Server 向けの ODBC ドライバーおよび OLE DB プロバイダーの移行を皆さんにご検討いただきたく、本記事で説明します。

Microsoft が提供する SQL Server 向け ODBC ドライバーおよび OLE DB プロバイダー

以下の記事の "ODBC" および "OLE DB (OLE DB)" で説明されているように、SQL Server 向けの ODBC ドライバーおよび OLE DB プロバイダーにはそれぞれ 3 つの世代があります。
Microsoft SQL Server のドライバー履歴

世代 ODBC ドライバー OLE DB プロバイダー
1 SQL Server (SQLSRV32) OLE DB Provider for SQL Server (SQLOLEDB)
2 SQL Server Native Client (SQLNCLI) SQL Server Native Client (SQLNCLI)
3 ODBC Driver for SQL Server (MSODBCSQL) OLE DB Driver for SQL Server (MSOLEDBSQL)

(*) 名称や略にはバージョン番号が入りますがここではいったん省略します。

それぞれの世代のサポート状況は以下の通りです。

  • 第 1 世代
    Windows OS 同梱の Windows Data Access Components の一部として提供されています。そのため Windows のサポート ライフサイクルに従います。
    ただし、SQL Server 2005 の第 2 世代のリリースにより第 1 世代の開発は終了、新規開発では使用を避けるべきレガシーコンポーネントとして非推奨 (Deprecated) の位置付けとなり、セキュリティ上の問題に対してのみ更新プログラムが提供されています。
    非推奨の MDAC/WDAC コンポーネント

  • 第 2 世代
    SQL Server 2005 で提供が開始され、SQL Server とともにインストールされます。また、SQL Server に接続するアプリケーションが動作する環境など、SQL Server 関連の機能をまとめた Feature Pack や単体のインストーラーによる入手が可能でした。
    しかし、第 3 世代のリリースにより第 2 世代は SQL Server 2012 相当のバージョン 11.0 で開発終了、こちらも新規開発では使用を避けるべきレガシーコンポーネントとして非推奨 (Deprecated) の位置付けとなりました。サポート ライフサイクルは SQL Server に従いますが、最終バージョンの 11.0 はそれに相当する SQL Server 2012 以降でもインストールされるため、以下のページの "サポート ライフサイクル" の箇所で説明されているようにサポートの提供は限定的であり、例外としての提供です。アプリケーションにて使用する場合には適用されませんので、アプリケーション開発・運用においては、第 2 世代は事実上サポートを終了している状態です。
    SQL Server Native Client のサポート ポリシー > サポート ライフサイクル

  • 第 3 世代
    ODBC ドライバー、OLE DB プロバイダーそれぞれにサポート ライフサイクルを定義していますので、それぞれのページでどのバージョンが現在サポート対象か確認できます。

古い ODBC ドライバー / OLE DB プロバイダー利用上のリスク

第 1 世代も第 2 世代も開発を終了していますので、現行の SQL Server や Azure SQL Database へのアクセスにおいて当然ながらそれらのサーバー側の新しい機能には完全に対応できないパターンがあります。また、以前のバージョンからの基本的な機能のみを使用するためその点は問題はないとして使用し続けるケースも見られますが、第 1 世代はサポート対象ではあるものの非推奨の位置付けですので、不具合に関してはセキュリティ脆弱性に相当しない限りはその修正は行われません。

そしてセキュリティ対策という点では、接続確立時に必ず行われる SSL/TLS 暗号化に関して、例外的に第 1 世代も (Windows Server 2016 同梱のコンポーネントを除き) TLS バージョン 1.1 および 1.2 には対応しましたが、TLS 1.3 以降への対応の予定はありません。TLS バージョンは 1.0 も有効化しているので問題ないというケースにおいても、仮にアプリケーション実行環境はそのまま、SQL Server 側をバージョンアップするにあたり、その稼働環境の OS もバージョンアップするようなケースでは特に OS 間の暗号スイートの差異などがあれば SSL ハンドシェイクができず、接続を確立できないという状況に陥ることもあります。

細かな事例の列挙はしませんが、簡単にあげるだけでもこのようなリスクがありますので、企業システムでこのような古い世代のものを使い続けることは望ましくないといえます。

移行の進め方

  1. まずは既存のアプリケーションで古いドライバーやプロバイダーが使用されているかどうか (移行検討対象か) を確認しましょう。
  2. 次に、システム要件など、移行可否を確認しましょう。
  3. 確認の結果として移行できる場合には移行方法を把握しましょう。
  4. そして移行した場合の動作を検証にて確認しましょう。

移行対象かどうかの確認方法

移行にあたっては既存のアプリケーションでどの世代の ODBC ドライバーおよび OLE DB プロバイダーを使用しているかを把握する必要がありますが、その確認方法としては主に以下の 2 種類の方法があげられます。

A. ソースコード検索
ソースコード一式から SQL Server 向けの接続設定 (接続文字列) を検索し、どの世代の名前の ODBC ドライバーもしくは OLE DB プロバイダーが指定されているかを確認します。

B. ロードされたモジュール確認
実際に SQL Server へアクセスする処理を実行している間にロードされた DLL ファイル名に、各世代の名前の ODBC ドライバーもしくは OLE DB プロバイダーが含まれているかを確認します。

具体例をあげます。

//// A について /////
アプリケーションでどのような API が使用されているかを把握できていることが望ましいですが、もしも把握できていない場合には単純に前述の "Microsoft が提供する SQL Server 向け ODBC ドライバーおよび OLE DB プロバイダー" で紹介した各世代の名前もしくは略語で検索してみましょう。
参考までに、いくつかの API のパターンについて説明します。

  • ADO を使用している場合
    接続には主に Connection オブジェクトを使用しますので、接続先などの情報はその ConnectionString プロパティに渡す文字列、もしくは、Open メソッド時に指定する文字列に指定します。これが接続文字列です。また、OLE DB を介して OLE DB プロバイダーを使用して SQL Server に接続しますので、接続文字列には次のように Provider= の箇所に使用される OLE DB プロバイダー名が指定されます。
    ~~
    Provider=SQLOLEDB;Data Source=servername;Initial Catalog=databasename;Integrated Security=SSPI;
    ~~
    つまり、Provider というキーワードで検索することで使用されている OLE DB プロバイダー名を確認できます。 また、SQLOLEDB や SQLNCLI といった OLE DB プロバイダー名で検索してみてもよいでしょう。時々 OLE DB プロバイダーから ODBC ドライバーを経由するような接続手法を取っているケースもありますので、接続文字列全体を見てみることも忘れずに。

  • C++ から ODBC API を使用している場合
    接続には SQLDriverConnect 関数もしくは SQLConnect 関数が使用されますのでそれらを探すのが最も効率的です。
    まずは SQLDriverConnect 関数を検索してみましょう。ADO の場合と同様に接続文字列が渡され、そこには Driver= の箇所に使用される ODBC ドライバーの名前が指定されますのでその名前でどの世代の ODBC ドライバーが指定されているかを把握できるでしょう。
    ~~
    SQLCHAR connstr[] = "Driver={SQL Server};Server=SERVER01;Database=master;Trusted_Connection=yes;";
    ret = SQLDriverConnect(hDbc, (SQLHWND)NULL, connstr, SQL_NTS, connstrout, 1024, &outconnstrlen, SQL_DRIVER_NOPROMPT);

    ~~
    また、ADO の場合と同様に ODBC ドライバーの名前を検索するのもよいでしょう。ここでは略語ではなく、ODBC ドライバーの名前で検索することになりますが、幸いにどの世代も必ず SQL Server が名称にありますので、これを探してみるのもよいかもしれません。
    もしどちらも見つからない場合には接続に SQLConnect 関数が使用されている可能性がありますのでこの関数名で検索してみましょう。この場合、あらかじめその環境に用意されている ODBC データソース (DSN) の名前が指定されているはずです。その環境の ODBC データソース アドミニストレーター (odbcad32.exe) を起動すると、一致する DSN 名が [ユーザー DSN] もしくは [システム DSN] で見つけられると思いますので、どの ODBC ドライバーを使用して構成されたものかを確認しましょう。

  • ADO.NET を使用している場合
    SQL Server に対しては System.Data.SqlClient もしくは Microsoft.Data.SqlClient の名前空間のクラスを使用しているケースがほとんどですが、もしも System.Data.Odbc もしくは System.Data.OleDb を使用している場合には ODBC ドライバー / OLE DB プロバイダーが使用されていることになりますので、まずはこの点を確認しましょう。検索で System.Data.OdbcSystem.Data.OleDb、もしくは、OdbcConnectionOleDbConnection のようなクラス名を検索してみるのがよいでしょう。
    確認の結果、もしも System.Data.OleDb や OleDbConnection が見つかったら ADO の場合と同様に接続文字列に Provider の指定があるはずですので、その箇所を探すとよいでしょう。
    System.Data.Odbc の場合は C++ から ODBC API の SQLDriverConnect 関数を呼ぶ場合と同様に Driver の指定がある、もしくは、SQLConnect と同様の DSN の指定があるはずですので、そこから使用されている ODBC ドライバーを把握できます。

//// B について /////
いくつか方法はありますが、可能な限り確実に捉える方法として Process Monitor ツールを使用する方法を紹介します。

Process Monitor ログの採取手順

上記ブログを参考にアプリケーションが SQL Server にアクセスしている間のログを取得してみてください。採取手順の "情報採取手順 (長期間の採取)" の方にある手順 3. の Filter の設定で対象となるアプリケーションプロセスの名前を指定しておくとその後の解析が楽になるでしょう。

さて取得できたら次のように Filter の設定を追加してみましょう。

  • [Operation] [begin with] [Load]
  • [Path] [contains] [sql]

絞られたログは、対象のアプリケーション プロセスにロードされたモジュールのうち、ファイルのパスに sql が含まれているものだけになります。この中から、対象の ODBC ドライバーや OLE DB プロバイダーがロードされているかを見てみましょう。

移行可否の確認

SQL Server ODBC ドライバーや SQL Server Native Client ドライバーは第 3 世代の ODBC Driver for SQL Server へ、SQLOLEDB や SQLNCLI OLE DB プロバイダーは第 3 世代の OLE DB Driver for SQL Server へ移行することを検討することとなりますが、そのサポートライフサイクルやシステム要件を確認し、今回の対象の環境にインストールして利用できるバージョンをそれぞれ確認しましょう。
サポート ライフサイクルは前述しましたので、ここではシステム要件のページを紹介します。

移行方法の把握

移行においては主に次の 2 点が必要となります。

  1. 第 3 世代の ODBC ドライバーもしくは OLE DB ドライバーのインストール
  2. アプリケーションで使用されている接続文字列に指定されている ODBC ドライバー名や OLE DB プロバイダー名の変更
    ※ODBC DSN を使用しているケースではその DSN の削除と新しいドライバーで同名の DSN 作成

上記のみでよいかどうかについては念のためリリースノートを確認しましょう。特に、新しいバージョンの ODBC ドライバーや OLE DB プロバイダーでは既定で暗号化が有効となりますので、SQL Server 側で暗号化を強制しておらず暗号化に必要となる証明書がないようなケースにおいては接続が失敗する可能性があります。このようなケースにおいては暗号化を前提として証明書などを用意して構成するか、もしくは、以前と同様に明示的には暗号化しないよう接続文字列にオプションを追加するかなどを検討します。

移行した場合の動作検証

念のため一通りのテストによる動作確認をお願いします。主に前述の接続文字列や DSN の変更のみで動作するかどうか、リリースノートなどで得られる変更点などへの対応が必要か、それ以外の問題がないかの検出と対策を行います。

まとめ

SQL Server へアクセスするアプリケーションから OS 同梱の ODBC ドライバーや OLE DB プロバイダーをそのまま使用できて便利でしたが、新しい SQL Server バージョンのリリースに合わせた機能対応が難しいなどの理由もあり、第 2 世代を経て第 3 世代へと代替わりしています。こうして現在では第 2 世代以前はレガシー技術に位置付けられています。

古い世代の ODBC ドライバーや OLE DB プロバイダーを利用したシステムをお持ちの場合には、より新しい機能への対応やセキュアなアクセスの観点からも、早めの移行をお勧めします。上記情報が移行計画を進める参考になればうれしいです。


本ブログの内容は弊社の公式見解として保証されるものではなく、開発・運用時の参考情報としてご活用いただくことを目的としています。もし公式な見解が必要な場合は、弊社ドキュメント (https://learn.microsoft.comhttps://support.microsoft.com) をご参照いただくか、もしくは私共サポートまでお問い合わせください。