【入門編】SQL Serverの「パススルー」クエリをVBAで制御:接続文字列の動的切り替えと認証情報の安全な管理 – Access VBA解析バイブル

スポンサーリンク

こんにちは! Access VBAの開発現場で、日夜データベースと格闘お疲れ様です。チーフアーキテクトの私です。

今回は、Accessの枠を超えてSQL Serverなどの本格的な巨大データベースと渡り合うための極意、「パススルークエリをVBAで自在に操る技術」を伝授します。

「リンクテーブルを使っているけど、接続先の本番・テスト環境の切り替えで毎回死にそうになっている…」
「認証情報をコードに直書きしてセキュリティ監査で怒られた…」

そんな悩みを抱えていませんか? 大丈夫、ここをクリアすれば、あなたのAccess VBAスキルは間違いなくプロの領域に到達します。基礎から本質まで、優しく、そして徹底的に解説していきましょう!

—

1. なぜ「リンクテーブル」ではなく「パススルークエリ」なのか?

Access初学者の多くは、SQL Serverのデータを扱うときに「リンクテーブル」を作りますよね。確かに簡単ですが、大規模なデータや複雑な集計をさせると、Accessがローカルにデータを引っ張ってきて処理するため、ネットワークがパンクしそうになります。

ここで登場するのが 「パススルークエリ(Pass-Through Query)」 です。

  • パススルークエリとは?

Accessはただの「郵便受け」になり、SQL文をそのままSQL Serverに丸投げ(パススルー)します。重い処理はすべてSQL Server側で爆速で実行され、結果だけが返ってくる仕組みです。

これをVBAから動的に生成し、実行時に接続先(IPアドレスやパスワード)を切り替えられたとしたら……? 環境移行も、セキュリティ対策も、一瞬で解決しますよね。

—

2. 接続情報の動的切り替えと安全な管理の全体像

実務で最も恐ろしいのは、「接続文字列(コネクションストリング)の中にパスワードを生で書き込んでしまうこと」です。ソースコードやAccessファイルを見られたら、データベースが丸見えになってしまいます。

そこで、今回のアーキテクチャのポイントは以下の2点です。

1. QueryDefオブジェクトを使い、VBAから一時的(あるいは動的)にパススルークエリのSQLと接続文字列を書き換えて実行する。
2. 認証情報はハードコーディングせず、Windows認証を使うか、あるいは安全なプロンプト・設定ファイルから取得する(今回は王道のODBC Driver経由の安全な記述方法を解説します)。

—

3. 実装コード:動的パススルークエリ実行の決定版

それでは、現場でそのままコピペして使える実用コードを公開します。
適当な標準モジュールに貼り付けて、中身をあなたの環境に合わせて書き換えてみてください。

Option Explicit

‘ ==============================================================================
‘ 担当: チーフアーキテクト
‘ 概要: SQL Serverへのパススルークエリを動的に生成・実行するサンプルプロシージャ
‘ ==============================================================================
Public Sub ExecuteDynamicPassThrough()

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strQueryName As String
Dim strSQL As String
Dim strConn As String

‘ 1. 使用するクエリの名前(あらかじめ空のパススルークエリを作っておくか、動的生成する)
strQueryName = “tmp_PassThrough_Query”

Set db = CurrentDb

‘ 2. 既存の同名クエリがあれば削除(クリーンアップの徹底はプロの基本です)
On Error Resume Next
db.QueryDefs.Delete strQueryName
On Error GoTo 0

‘ 3. パススルークエリ(QueryDef)を新規作成
Set qdf = db.CreateQueryDef(strQueryName)

‘ 4. 接続文字列(ConnectionString)の設定
‘ ※【重要】ODBC Driver 17以降の使用を推奨します。
‘ サーバ名、データベース名を環境に合わせて書き換えてください。
strConn = “ODBC;Driver={ODBC Driver 17 for SQL Server};” & _
“Server=YOUR_SERVER_NAME\SQLEXPRESS;” & _
“Database=YOUR_DB_NAME;” & _
“Trusted_Connection=Yes;” ‘ ← Windows認証の場合(パスワード不要で安全!)

‘ ※もしSQL Server認証(ID/PW指定)を使う場合はこう書きます(注意して管理!)
‘ strConn = “ODBC;Driver={ODBC Driver 17 for SQL Server};” & _
‘ “Server=myServerAddress;Database=myDataBase;” & _
‘ “Uid=myUsername;Pwd=myPassword;”

qdf.Connect = strConn

‘ 5. サーバー側に返すSQL文を構築
‘ ※Accessの関数(MidやNzなど)は使えません!完全にSQL Serverの方言(T-SQL)で書きます。
strSQL = “SELECT EmployeeID, FirstName, LastName ” & _
“FROM dbo.Employees ” & _
“WHERE HireDate >= ‘2023-01-01’;”

qdf.SQL = strSQL

‘ 6. 【超重要】「データが返るクエリか?」を明示する設定
‘ SELECT文なら True、UPDATE/INSERT/DELETE なら False にします。
qdf.ReturnsRecords = True

‘ 7. クエリの実行(今回はイミディエイトウィンドウに結果の件数を出すテスト)
Dim rs As DAO.Recordset
Set rs = qdf.OpenRecordset()

MsgBox “SQL Serverからデータを取得しました! 取得件数: ” & rs.RecordCount & “件”, vbInformation, “成功”

‘ 後片付け
rs.Close
Set rs = Nothing

‘ 用事が済んだ一時クエリは削除してAccessを汚さない
db.QueryDefs.Delete strQueryName

Set qdf = Nothing
Set db = Nothing

Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
If Not rs Is Nothing Then rs.Close: Set rs = Nothing
Set qdf = Nothing
Set db = Nothing
End Sub

—

4. ここでつまずく!初心者が陥りやすい「3つの罠」

このコードを動かすとき、あるいは実務で応用するときに、多くの開発者がハマるポイントを先回りして解説しておきます。ここさえ知っていれば怖くありません。

罠その1:「Accessの関数が動かない!」とパニックになる

パススルークエリの中身(`qdf.SQL`に代入する文字列)は、Accessの常識が一切通用しません。
`Format()`関数や`Nz()`関数、`Mid()`関数などを書くと、SQL Server側が「そんな関数知らない!」とエラーを吐きます。

  • 対策: 書くSQLはすべて「T-SQL(SQL Server用の方言)」で記述してください。文字列結合なら `+` や `CONCAT()` を使います。

罠その2:「ReturnsRecords = True」を忘れてデータが消えた(ように見える)

SELECT文を発行しているにもかかわらず、`qdf.ReturnsRecords = False`(デフォルト)のままで `OpenRecordset()` を実行すると、エラーになるか、正しくレコードセットが取得できません。

  • 対策: データを「取得する」クエリなら必ず `True`、「更新・追加・削除」なら `False`。このスイッチングを間違えないように。

罠その3:パスワードのハードコーディングによるセキュリティ事故

先ほどコード内で `Trusted_Connection=Yes`(Windows認証)を推したのは理由があります。コード内に明文のパスワードを書くのは、現代のセキュリティ基準では「ご法度」です。

  • 対策: 可能であれば社内インフラはWindows認証で統合し、どうしてもSQL Server認証が必要な場合は、Windowsの資格情報マネージャーや、暗号化された外部設定ファイルから接続文字列を動的に組み立てる設計にしましょう。

—

最後に:ここをクリアすれば、Access VBAの基本はバッチリ!

お疲れ様でした!
リンクテーブルの呪縛から離れ、VBAから直接SQL Serverをコントロールする「パススルークエリの動的生成」の技術、いかがでしたでしょうか。

このテクニックがモノになると、Accessは単なる「古いデスクトップアプリ」から、「強力なエンタープライズ・システムの超軽量フロントエンド(UI)」へと生まれ変わります。大規模データを軽々とさばくシステムを、あなたが自在に構築できるようになるのです。

ぜひご自身の開発環境で試して、この「爆速でサーバーを叩く感覚」を味わってみてください。
あなたのAccess開発ライフが、より知的でエキサイティングなものになることを応援しています!

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