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)への接続です。焦らず、一歩ずつ、強固なシステムを構築していきましょう。
応援しています。困ったときは、またいつでも質問してくださいね。
