Access VBAの「黒魔術」:QueryDefを掌握し、誰が何をしたかを暴く監査ログの実装
こんにちは。Accessの迷宮を探索する皆さんの道標として、今日も現場で培った「極限の知見」を共有します。
Access開発において、多くの人が「クエリを保存して、ダブルクリックで実行する」という段階で足踏みします。しかし、真のエンジニアは「クエリが実行されるその瞬間」を完全に制御します。
今回は、QueryDef(クエリ定義)を動的に操作し、SQLが実行される直前に「誰が・いつ・何を」実行したかを自動的に記録する、いわば「クエリの実行前イベント」を擬似的に再現するテクニックを伝授します。
—
1. なぜ「実行前イベント」が必要なのか?
通常、Accessのクエリはブラックボックスです。誰かがDELETEクエリやUPDATEクエリを実行しても、後から「誰が消したんだ?」と追跡するのは困難です。
そこで、QueryDefオブジェクトをVBAでラップし、「SQLを投げる前にログテーブルに書き込む」というワンクッションを強制的に挟む設計にします。これができると、システムに圧倒的な信頼性と監査能力が生まれます。
—
2. 実装の設計図
今回は以下のステップで実装します。
1. ログ用テーブルの作成: `tbl_QueryLog`(実行日時、ユーザー名、SQL文を記録)
2. 実行関数のラップ: クエリを直接実行させず、専用の関数を経由させる。
3. 動的パラメーターの注入: 必要に応じてSQLを書き換えて実行する。
—
3. 実装コード:クエリ実行の門番を作る
まずは標準モジュールに以下のコードをコピペしてください。これが、あなたのアプリの「監査ゲートウェイ」になります。
‘ — クエリ実行の監査ゲートウェイ —
Public Sub ExecuteQueryWithAudit(queryName As String)
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
Dim strUser As String
Set db = CurrentDb
Set qdf = db.QueryDefs(queryName)
‘ 1. 実行されるSQLを取得
strSQL = qdf.SQL
‘ 2. 現在のユーザーを取得(環境に合わせて変更してください)
strUser = Environ(“USERNAME”)
‘ 3. 監査ログを記録する
Dim logSql As String
logSql = “INSERT INTO tbl_QueryLog (ExecDate, UserName, QueryName, SqlText) ” & _
“VALUES (Now(), ‘” & strUser & “‘, ‘” & queryName & “‘, ‘” & Replace(strSQL, “‘”, “””) & “‘)”
db.Execute logSql, dbFailOnError
‘ 4. 本来のクエリを実行
qdf.Execute dbFailOnError
MsgBox “クエリ ‘” & queryName & “‘ を実行し、ログを保存しました。”, vbInformation
Set qdf = Nothing
Set db = Nothing
End Sub
コードの解説(ここが重要!)
- `dbFailOnError`: これを忘れると、クエリが失敗してもエラーが握りつぶされます。開発の現場では必須のオプションです。
- `Replace(strSQL, “‘”, “””)`: SQL文の中にシングルクォーテーションが含まれるとエラーになります。これを2つ重ねることで、SQLの文法エラーを回避する「エスケープ処理」を行っています。
—
4. 初学者が陥りやすい罠
罠1:パラメータークエリの罠
もしクエリに `[IDを入力してください]` のようなパラメーターが含まれている場合、上記の `qdf.Execute` では上手く動きません。その場合は、以下のように `Parameters` コレクションを明示的に指定する必要があります。
‘ パラメーターがある場合の書き方
qdf.Parameters(“[ID]”) = 100
qdf.Execute dbFailOnError
罠2:ログテーブルの肥大化
監査ログは非常に重要ですが、数年経つとテーブルが数百万件に膨れ上がります。ログテーブルには必ずインデックスを貼り、定期的に古いログを別テーブルへ退避する運用をセットで考えましょう。
—
5. 最後に:マクロの記録から「アーキテクト」へ
マクロやクエリデザイン画面でポチポチと設定する段階を卒業し、このようにVBAで「実行プロセスそのものを制御」し始めると、Accessは単なる事務ツールから、堅牢な業務アプリケーションへと進化します。
「誰が・いつ・何を」。この情報を手中に収めることは、エンジニアとしての責任であり、最大の武器です。
まずはこのコードを自分のプロジェクトに組み込んでみてください。実行ボタンを押した瞬間に、自分のコードが裏側で静かにログを刻んでいるのを確認したとき、あなたはもう一つ上のエンジニアの視座に立っています。
次回のテーマは、「DAOとADOの使い分け:なぜ今、あえてDAOなのか?」について掘り下げていきます。それでは、快適なAccessライフを!
