Access VBAの深淵へ:管理用クエリを「影」に隠す、プロのセキュリティ実装術
こんにちは。Accessという広大な海に挑む皆さんの航海をサポートするチーフアーキテクトです。
これまで「クエリ作成画面」にクエリを並べて管理していませんでしたか? それは便利ですが、誰でも中身が見られ、誰でも実行できてしまうという「セキュリティの穴」を放置していることと同じです。
今日は、「必要な時だけ生成し、終われば消し去る」という、プロフェッショナルなクエリ管理術を伝授します。これを使えば、管理用クエリを覗き見られるリスクから解放されますよ。
—
なぜ「QueryDef」で動的に制御するのか?
通常、Accessのクエリは「オブジェクト」として保存されます。しかし、機密性の高い処理(データの全削除や権限変更など)を永続的に保存しておくのは危険です。
そこで、DAO(Data Access Objects)の`QueryDef`オブジェクトを使います。
これは「メモリ上に一時的なクエリ定義を作成し、実行後に消滅させる」という、いわば「使い捨ての武器」を生成するような手法です。
この手法のメリット
1. 隠蔽性: 普段はクエリ一覧に存在しないため、一般ユーザーには何をしているか分からない。
2. 実行制御: コード内で「管理者権限があるか?」を判定し、クリアした者だけが生成プロセスを通れるように制限できる。
—
実装の極意:管理者限定「動的クエリ実行」コード
まずは、特定の条件(ここでは管理者ID)を満たした場合のみクエリを生成・実行するコードの骨組みを見てみましょう。
Public Sub ExecuteAdminQuery(strSQL As String, adminFlag As Boolean)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Const QRY_NAME = “temp_AdminTask” ‘ 一時クエリの名前
‘ 1. 管理者権限のチェック(ここが門番です)
If Not adminFlag Then
MsgBox “権限がありません。”, vbCritical
Exit Sub
End If
Set db = CurrentDb
‘ 2. 既存の同名クエリがあれば削除(クリーンな状態を作る)
On Error Resume Next
db.QueryDefs.Delete QRY_NAME
On Error GoTo 0
‘ 3. 新規にクエリを定義して生成
Set qdf = db.CreateQueryDef(QRY_NAME, strSQL)
‘ 4. 実行
qdf.Execute dbFailOnError
‘ 5. 後片付け(証拠を残さない!)
db.QueryDefs.Delete QRY_NAME
MsgBox “管理処理が完了しました。”, vbInformation
Set qdf = Nothing
Set db = Nothing
End Sub
—
コードの「魂」を読み解く:3つの重要ポイント
1. `CreateQueryDef` の魔力
`CreateQueryDef` は、SQL文を名前付きのオブジェクトに昇格させます。通常は保存されますが、あえて最後に `Delete` することで、データベースファイル内に「痕跡」を残さないようにしています。
2. `dbFailOnError` の重要性
`qdf.Execute` の引数に `dbFailOnError` を指定するのは鉄則です。これがないと、SQLエラーが起きた際、Accessは「何事もなかったかのように」処理を無視して突き進みます。エラーを確実に検知し、安全に停止させるための「安全装置」だと考えてください。
3. `On Error Resume Next` の正しい使い方
一時的なクエリを削除する際、まだ存在しない場合はエラーになります。あえてこの行を挟むことで、「あれば消す、なければ無視する」というスマートな処理を実現しています。
—
初学者が陥りやすい「落とし穴」
- 「クエリが消えない!」問題: エラーハンドリングを怠ると、コードが途中で止まり、`temp_AdminTask` という名の空クエリが残り続けます。常に最後は `Nothing` にし、可能であれば `Error` トラップでクリーンアップ処理(Delete)を通るように設計しましょう。
- パラメータクエリの罠: もし動的SQLに変数を含めるなら、文字列結合でSQLを作るのではなく、`qdf.Parameters` を使いましょう。これはSQLインジェクション対策の基本であり、プロとしての必須教養です。
—
最後に:エンジニアとしての一歩先へ
「クエリを隠す」という発想は、単なるセキュリティ技術ではなく、「システムのライフサイクルを意識する」というエンジニアの思考そのものです。
「作って終わり」ではなく、「生成して、実行し、消滅させる」。このサイクルを意識するだけで、あなたの書くVBAは驚くほど堅牢で美しいものに進化します。
今回のコードを、まずは自分のテスト環境で動かしてみてください。「自分の手でデータベースを制御している」という感覚が掴めれば、もうあなたは脱・初級者です。
次は、パラメーターを安全にバインドする方法について深く掘り下げていきましょう。応援していますよ!
