Accessで業務システムを運用していると、次のような問い合わせを受けることがあります。
- 誰がデータを変更したのか分からない
- いつ値が変わったのか確認したい
- 削除されたデータを追跡したい
- 誤更新の原因を特定したい
こうした問題を解決するのが「監査ログ機能」です。
結論から言うと、Access VBAで更新履歴を自動記録する仕組みを実装することで、テーブルの変更履歴を可視化できるようになります。
近年はCSV自動取込やPDF出力、夜間バッチなどの自動化が進んでいますが、システムが成熟してくると重要になるのが「誰が何を変更したか」を把握する監査機能です。
- はじめに
- 監査ログとは
- 監査ログテーブルを作成する
- なぜ監査ログが必要なのか
- 逆引き① 更新前の値を取得したい
- 逆引き② 現在値を取得したい
- 逆引き③ 値が変更されたか確認したい
- 逆引き④ ログを登録したい
- 逆引き⑤ 変更者を記録したい
- 実践例① 顧客マスタ変更履歴
- 実践例② ステータス変更履歴
- 実践例③ 金額変更履歴
- 共通関数化する
- 削除履歴も管理する
- 実務活用例① 顧客管理システム
- 実務活用例② 設備管理
- 実務活用例③ 見積管理
- ログ肥大化対策
- エラー処理を実装する
- Copilot活用術① 監査ログ機能作成
- Copilot活用術② コードレビュー
- Copilot活用術③ テーブル設計支援
- 監査ログ導入のポイント
- AI時代でも価値が高い監査機能
- まとめ
はじめに
例えば顧客マスタで次のようなことが発生します。
顧客名が変更されている
担当者が分からない
変更理由も不明
これでは原因調査に多くの時間がかかります。
監査ログを導入すると、
変更日時
変更前
変更後
実行者
を記録できます。
監査ログとは
データ変更履歴を自動保存する仕組みです。
例えば、
| 項目 | 変更前 | 変更後 |
|---|---|---|
| 顧客名 | 東京商事 | 東京商事㈱ |
という履歴を保存します。
問題発生時の調査が非常に容易になります。
監査ログテーブルを作成する
まず履歴保存用テーブルを作成します。
T_AUDIT_LOG
| 項目名 |
|---|
| ID |
| 変更日時 |
| テーブル名 |
| 項目名 |
| 変更前 |
| 変更後 |
| 変更者 |
基本的にはこの構成で十分です。
なぜ監査ログが必要なのか
実務では以下の場面で活躍します。
誤更新調査
誰が変更したか確認できる
内部統制
運用履歴を残せる
顧客問い合わせ対応
変更履歴を提示できる
保守運用
システム異常の原因分析ができる
逆引き① 更新前の値を取得したい
変更前データを保持します。
Dim strOldName As String
strOldName = Me!顧客名.OldValue
フォーム更新時によく利用します。
逆引き② 現在値を取得したい
変更後の値です。
Dim strNewName As String
strNewName = Me!顧客名
比較に利用します。
逆引き③ 値が変更されたか確認したい
変更時のみ記録します。
If Me!顧客名 <> _
Me!顧客名.OldValue Then
MsgBox "変更あり"
End If
不要なログ増加を防げます。
逆引き④ ログを登録したい
履歴保存処理です。
CurrentDb.Execute _
"INSERT INTO T_AUDIT_LOG(" & _
"変更日時,項目名,変更前,変更後)" & _
"VALUES(" & _
"Now()," & _
"'顧客名'," & _
"'東京商事'," & _
"'東京商事㈱')"
基本となる実装です。
逆引き⑤ 変更者を記録したい
Windowsログイン名を取得します。
Dim strUser As String
strUser = Environ("USERNAME")
ログへ保存します。
CurrentDb.Execute _
"INSERT INTO T_AUDIT_LOG(" & _
"変更者)" & _
"VALUES('" & _
strUser & "')"
実践例① 顧客マスタ変更履歴
フォーム更新時に実行します。
Private Sub Form_BeforeUpdate( _
Cancel As Integer)
If Me!顧客名 <> _
Me!顧客名.OldValue Then
Call WriteAuditLog
End If
End Sub
非常に実用的です。
実践例② ステータス変更履歴
案件管理システムで利用します。
受付
↓
対応中
↓
完了
変化履歴を保存できます。
実践例③ 金額変更履歴
重要データの監査です。
変更前
100,000
変更後
120,000
内部統制にも役立ちます。
共通関数化する
実務では関数化がおすすめです。
Public Sub WriteAuditLog( _
ByVal TableName As String, _
ByVal FieldName As String, _
ByVal OldValue As String, _
ByVal NewValue As String)
CurrentDb.Execute _
"INSERT INTO T_AUDIT_LOG(" & _
"変更日時,テーブル名,項目名," & _
"変更前,変更後)" & _
"VALUES(" & _
"Now()," & _
"'" & TableName & "'," & _
"'" & FieldName & "'," & _
"'" & OldValue & "'," & _
"'" & NewValue & "')"
End Sub
利用側のコードがシンプルになります。
削除履歴も管理する
削除は特に重要です。
記録例
削除日時
削除対象
削除実行者
誤削除時の調査に役立ちます。
実務活用例① 顧客管理システム
変更履歴の追跡
顧客名
住所
担当者
の変更確認に利用できます。
実務活用例② 設備管理
設備状態の変化管理です。
稼働中
停止中
保守中
履歴確認が容易になります。
実務活用例③ 見積管理
金額変更履歴を保存します。
初回見積
改訂見積
最終見積
の比較が可能です。
ログ肥大化対策
監査ログは増加し続けます。
アーカイブを実施
古いデータを退避する
対象を絞る
重要項目のみ記録
保存期間設定
3年や5年など
運用ルールを決めましょう。
エラー処理を実装する
ログ処理にも必要です。
On Error GoTo ErrHandler
Call WriteAuditLog
Exit Sub
ErrHandler:
MsgBox Err.Description
長期運用で重要になります。
Copilot活用術① 監査ログ機能作成
Copilotへ依頼します。
Access VBAで
監査ログ機能を作成してください。
条件
・変更前後記録
・変更者保存
・共通関数化
・エラー処理あり
高品質な雛形を短時間で作成できます。
Copilot活用術② コードレビュー
既存コードに対して、
保守性改善案を教えてください
と依頼します。
関数化や共通化の提案が得られます。
Copilot活用術③ テーブル設計支援
例えば、
監査ログテーブルの
設計案を作成してください
と依頼できます。
設計品質向上につながります。
監査ログ導入のポイント
全項目を記録しない
重要な項目に絞る
ログ自身を変更禁止にする
信頼性確保
更新時のみ記録
不要なデータ増加防止
定期バックアップ
運用継続性向上
ログ閲覧画面を作成
調査効率向上
AI時代でも価値が高い監査機能
Copilotによって、
- VBA作成
- SQL作成
- ドキュメント作成
- エラー解析
は効率化されています。
しかし、
誰が
いつ
何を
変更したか
を管理する監査機能は依然として重要です。
特に業務システムでは、トラブル調査や内部統制の観点から監査ログの価値が高まっています。
まとめ
監査ログ機能は派手な機能ではありません。
しかし長期間運用されるAccessシステムでは非常に重要な役割を果たします。
特に、
- 顧客管理
- 案件管理
- 設備管理
- 見積管理
- マスタ管理
などでは高い効果があります。
またCopilotを活用することで、
- テーブル設計
- VBA作成
- コードレビュー
- 保守改善
を効率的に進められます。
システムトラブルは発生してから対応するのではなく、監査ログを事前に実装しておくことで迅速な原因究明が可能になります。運用開始前の段階からぜひ導入を検討してみてください。

コメント