Accessの「密かな変化」を見逃すな:テーブル定義監視ツールの極意
こんにちは。システム開発の現場で、Accessのメンテナンスに頭を悩ませてきた経験はありますか?
「誰かが勝手にテーブルのフィールドを増やしたせいで、既存のクエリがエラーになった」
「いつの間にかデータ型が変わっていて、インポート処理が全滅した」
こんな悪夢のような事態を未然に防ぐのが、今回作成する「テーブル定義変更監視ツール」です。Accessの内部構造を司る「DAO(Data Access Objects)」を掌握し、神の視点からデータベースを監視しましょう。
—
1. なぜ「TableDef」を知る必要があるのか?
Accessにおいて、テーブルの設計図は`TableDef`オブジェクトに格納されています。
多くのユーザーは「テーブル=データが入っている箱」としか見ていませんが、プロのエンジニアは「テーブル=メタデータ(定義情報)の集合体」と捉えます。
`TableDef`には、`LastUpdated`というプロパティが存在します。これは「テーブルの構造」が最後に変更された日時を保持しています。このプロパティを監視すれば、誰がいつ、構造をいじったかを即座に検知できるのです。
—
2. 監視ツールの心臓部:比較エンジンの設計
今回作成するツールは、以下のステップで動作します。
1. 現在の状態をスナップショットとして保存する(別のテーブルに全フィールド情報を書き出す)。
2. 定期的に実行し、現在の定義とスナップショットを突き合わせる。
3. 差異があれば、Outlookを起動して管理者にメールを送る。
実装コード:定義変更を検知する関数
このコードを標準モジュールに貼り付けてください。
Option Compare Database
Option Explicit
‘ テーブルの構造変更をチェックするプロシージャ
Public Sub CheckTableDefinition()
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim lastUpdate As Date
Set db = CurrentDb
‘ システムテーブルを除外してループ
For Each tdf In db.TableDefs
If Left(tdf.Name, 4) <> “MSys” Then
‘ 前回の記録と比較する処理を想定(今回は概念を示す)
lastUpdate = tdf.LastUpdated
‘ 変更がある場合(簡易判定)
If IsStructureChanged(tdf.Name, lastUpdate) Then
Call SendAlertEmail(tdf.Name, lastUpdate)
End If
End If
Next tdf
End Sub
‘ メール送信のロジック
Private Sub SendAlertEmail(tableName As String, updatedTime As Date)
Dim olApp As Object
Dim olMail As Object
Set olApp = CreateObject(“Outlook.Application”)
Set olMail = olApp.CreateItem(0)
With olMail
.To = “admin@example.com”
.Subject = “【警告】テーブル定義が変更されました: ” & tableName
.Body = “テーブル [” & tableName & “] の構造が ” & updatedTime & ” に変更されました。”
.Send
End With
Set olMail = Nothing
Set olApp = Nothing
End Sub
—
3. 陥りやすい罠:ここをクリアすれば一人前!
初学者がこのコードを組む際、必ず躓くポイントが2つあります。ここさえ押さえれば、あなたはもう初心者ではありません。
① 「システムテーブル」の罠
Accessには、ユーザーには見えない`MSys`で始まるシステムテーブルが多数存在します。これらはAccessの根幹部分であり、頻繁に更新されます。`If Left(tdf.Name, 4) <> “MSys”` というフィルタリングを忘れると、永遠にメールが届き続けるスパムツールになってしまいます。
② 「参照設定」の管理
上記のコードでは `DAO.Database` を使用しています。これを動かすには、VBAエディタのメニューから [ツール] > [参照設定] を開き、“Microsoft Office 16.0 Access database engine Object Library” にチェックが入っていることを確認してください。ここが外れていると「ユーザー定義型は定義されていません」というエラーが出ますが、これは「Accessの標準パーツを読み込んでいない」という意味です。
—
4. チーフアーキテクトからのアドバイス:保守性の極み
今回紹介したのは「変更を検知する」ための基礎です。実運用では、さらに一歩進んで、「変更前のフィールド名と変更後のフィールド名」を比較するロジックを追加することをお勧めします。
- `tdf.Fields` コレクションをループする
- フィールド名、データ型(`Type`)、サイズ(`Size`)を別のマスターテーブルと照合する
これを自動化しておけば、Accessのファイルがどれほど巨大になっても、あなたは「何が変わったか」を一瞬で把握できる最強の番人になれます。
プログラミングとは、書くことよりも「いかにしてシステムの綻びを早期発見するか」という知的なゲームです。ぜひこのツールを拡張して、あなただけの「データベース防衛システム」を作り上げてください。
ここをクリアしたあなたなら、次はSQLのパフォーマンスチューニングの世界もすぐそこですよ。頑張ってくださいね!
