Access VBAの「聖域」を守れ:QueryDefを暗号化してSQLロジックを隠蔽する極意
Access開発の現場で、長年「最後の課題」として議論されるのが「SQLロジックの保護」だ。
`.accdb`ファイルは、どれほど複雑なクエリを構築しても、ナビゲーションウィンドウから「デザインビュー」を開けば、誰でもそのアルゴリズムを盗み見ることができる。知的財産が詰まった複雑なSQLが白日の下に晒される現状を、君は放置していないか?
本稿では、`QueryDef`オブジェクトのSQLプロパティを暗号化し、実行時にメモリ上で復号して動的に走らせる「最終防衛ライン」の構築手法を伝授する。
—
なぜ「そのまま」保存してはいけないのか
Accessにおいて、クエリは単なるデータ取得の手段ではない。業務ロジックそのものだ。
- 競合・盗用リスク: 苦労して作成した複雑な結合や計算式が、競合他社や退職者に流出する。
- 改ざんリスク: 誰かが不用意にクエリを編集し、業務基盤が崩壊する。
これらを防ぐための「難読化」は、単なる気休めではない。プロフェッショナルとして、守るべきロジックを「バイナリ・ゴミ」の形に変えて保存する責任がある。
—
実装戦略:メモリ上での動的クエリ実行
基本的な戦略は以下の通りだ。
1. 暗号化: SQL文をBase64や簡易XOR等でエンコードして`QueryDef`に保存する。
2. 復号: 実行時に`QueryDef.SQL`を読み取り、メモリ上で復号する。
3. 実行: 復号したSQLを`CurrentDb.CreateQueryDef`で一時オブジェクトとして走らせるか、`DoCmd.RunSQL`(アクションクエリの場合)で直接実行する。
実践:SQL暗号化・復号モジュール
以下に、実務でそのまま使える堅牢なクラス設計の断片を示す。
‘ 必要な参照設定: Microsoft DAO 3.6 Object Library 以上
‘ シンプルなXOR暗号化クラス (簡易的な難読化用)
Option Compare Database
Option Explicit
Public Function ObfuscateSQL(ByVal sql As String) As String
‘ 簡易的なXOR変換 + Base64変換を想定したモック
‘ ※本番ではより強固なAESライブラリ等を使用すること
Dim i As Long
Dim result As String
For i = 1 To Len(sql)
result = result & Chr(Asc(Mid(sql, i, 1)) Xor 123)
Next i
ObfuscateSQL = EncodeBase64(result)
End Function
Public Function ExecuteEncryptedQuery(ByVal queryName As String)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rawSQL As String
Set db = CurrentDb
Set qdf = db.QueryDefs(queryName)
‘ 保存されている暗号化SQLを復号
rawSQL = DecodeBase64(qdf.SQL)
rawSQL = ObfuscateSQL(rawSQL) ‘ 復号処理
‘ 実行用の一時クエリとして作成し実行
Dim tmpQdf As DAO.QueryDef
Set tmpQdf = db.CreateQueryDef(“”, rawSQL)
tmpQdf.Execute dbFailOnError
tmpQdf.Close
Set tmpQdf = Nothing
End Function
—
プロダクション環境での「3つの鉄則」
コードをコピペして終わりにしてはならない。伝説的なエンジニアを目指すなら、以下の設計思想を心に刻め。
1. 「一時クエリ」のライフサイクルを管理せよ
`CreateQueryDef`で名前を空文字`””`にして作成すると、そのクエリはメモリ上にのみ存在し、プロシージャ終了とともに消滅する。永続的なクエリを放置するのは、脆弱性の温床だ。必ず後始末を徹底すること。
2. パラメータクエリとのハイブリッド構成
複雑なSQLを丸ごと暗号化すると、可読性が著しく低下しメンテナンスが地獄と化す。
- 固定SQL部: 暗号化して`QueryDef`に隠蔽。
- 可変条件(WHERE句): `Parameters`コレクションを使い、動的にバインドする。
この分離こそが、保守性と保護性能を両立させる唯一の解だ。
3. 「鍵」をコード内に埋め込むな
暗号化のためのキーをVBAの定数としてハードコードしてはならない。それは「金庫の鍵を金庫の前に置く」のと同じだ。キーは外部の設定テーブルや、実行時にのみ生成される環境変数から読み込むように設計せよ。
—
結び:防御は「開発の美学」である
Accessが持つ「誰でも編集できる」という利便性は、時として「誰でも壊せる」という弱点になる。
我々エンジニアがやるべきことは、ツールを使いやすくするだけではない。「意図しない変更」からシステムを隔離し、ロジックという名の資産を守り抜くことだ。
この手法は、コードの難読化という名の「防壁」に過ぎない。しかし、その防壁を築こうとする姿勢こそが、君のシステムを真のプロダクションレベルへと昇華させる。
さあ、今すぐ既存のクエリを整理し、暗号化という名の聖域を構築せよ。それができるのは、この技術を理解した君だけなのだから。
