【入門編】QueryDefの「実行前イベント」を擬似的に再現する:SQL実行ログと実行ユーザーの自動記録 – Access VBA解析バイブル

スポンサーリンク

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ライフを!

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