【入門編】【上級】スキーマ変更の履歴を自動記録する「テーブル定義変更ログ」の実装 – Access VBA解析バイブル

スポンサーリンク

Accessをただの「データ管理ツール」から「堅牢なエンタープライズ・システム」へと昇華させる――。
今日は、多くの開発者が「後回し」にしがちな、しかしシステムの本質的な信頼性を左右する「テーブルスキーマ変更の監査ログ」についてお話しします。

「いつ、誰が、どのテーブルの構造を変えたのか?」
これを手動で管理しているようでは、プロのエンジニアとは言えません。Access VBAの `TableDef` オブジェクトを掌握し、変更の胎動を自動でキャッチする仕組みを構築しましょう。

1. なぜ「スキーマ変更」を監視する必要があるのか?

Accessのテーブルは、画面上で誰でも簡単に「デザインビュー」からフィールドを追加・削除できてしまいます。これが運用の現場では大惨事の元です。

  • 「誰かが勝手にデータ型を変えて、既存のクエリが動かなくなった」
  • 「フィールド名を変えたせいで、レポートが真っ白になった」

こうした事故を防ぐためには、「データベースの設計図(スキーマ)」そのものを監視対象にする必要があります。これこそが、中級者から「真のエンジニア」へ脱却する最初の関門です。

2. 監視の核となる「DAO.TableDef」と「Properties」

Access VBAでテーブル構造を操作するには、DAO (Data Access Objects) を使います。
`TableDef` オブジェクトは、テーブルそのものの設計図です。ここからフィールド名やデータ型を読み取ることができます。

しかし、スキーマ変更を「即座に検知」するイベント(トリガー)はAccessには存在しません。そこで、「起動時に設計図の現在値をスナップショットと比較し、差分があればログに残す」という戦略を採ります。

3. 実装:スキーマ変更ログ記録モジュール

以下のコードは、現在のテーブル定義をシステムテーブル(またはログ用テーブル)と比較し、変更があれば記録する最小構成のロジックです。

ステップ1:ログ用テーブルの作成

まず、`TBL_SchemaLog` という名前で以下の構成のテーブルを作成してください。

  • `LogID` (オートナンバー)
  • `TableName` (短いテキスト)
  • `FieldName` (短いテキスト)
  • `ChangeType` (短いテキスト:追加・変更・削除)
  • `ChangeDate` (日付/時刻)

ステップ2:監視コードの実装

‘ 標準モジュールに記述
Option Compare Database
Option Explicit

‘ テーブル構造をチェックし、ログに残すプロシージャ
Public Sub AuditTableSchema()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field

Set db = CurrentDb

‘ 全てのユーザー定義テーブルをループ
For Each tdf In db.TableDefs
‘ システムテーブル(MSysで始まるもの)は除外
If Left(tdf.Name, 4) <> “MSys” Then

‘ ここで各フィールドをスキャン
For Each fld In tdf.Fields
‘ 【本質的ポイント】
‘ ここで「現在のフィールド設定」と「前回記録した設定」を比較します
‘ 今回は例として、新規追加フィールドの検知ロジックを提示します
If IsNewField(tdf.Name, fld.Name) Then
LogSchemaChange tdf.Name, fld.Name, “フィールド追加”
End If
Next fld

End If
Next tdf

MsgBox “スキーマチェックが完了しました。”, vbInformation
End Sub

‘ ログを記録するヘルパー関数
Private Sub LogSchemaChange(tblName As String, fldName As String, changeType As String)
Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb
Set rs = db.OpenRecordset(“TBL_SchemaLog”)

rs.AddNew
rs!TableName = tblName
rs!FieldName = fldName
rs!ChangeType = changeType
rs!ChangeDate = Now
rs.Update

rs.Close
End Sub

4. プロの視点:このコードの「深淵」

初心者が陥りやすいのは、「比較のための『比較元データ』をどこに持つか」という設計ミスです。

  • 愚策: 毎回全テーブルの全プロパティをテキストファイルに書き出す。
  • 賢策: フィールドの `Properties` コレクションをハッシュ化(MD5等)し、その値をログテーブルに持たせておく。

今回のコードは基礎ですが、ここから一歩進むなら、`fld.Properties(“Type”)` や `fld.Properties(“Size”)` を取得し、前回の記録と照らし合わせて「型が変わった」「サイズが変わった」を判定するロジックを組み込んでください。

5. 最後に:エンジニアとして生きるために

この「スキーマ監視」を導入すると、あなたのAccessデータベースは「自己防衛能力」を持ち始めます。

最初は難しく感じるかもしれません。特に `DAO` のコレクション操作はメモリの管理も意識する必要があります。しかし、この壁を越えたとき、あなたは「Accessを操作する人」から「Accessというアプリケーションを設計するエンジニア」へと確実に成長しています。

「ここをクリアすれば、Access VBAの基本はバッチリですよ」。
次に目指すのは、ログの改ざんを防ぐためのバックエンド・データベース(SQL Server)への接続です。焦らず、一歩ずつ、強固なシステムを構築していきましょう。

応援しています。困ったときは、またいつでも質問してくださいね。

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