【入門編】【中級】テーブル定義の変更を検知し、変更箇所をメールで通知する監視ツールの開発 – Access VBA解析バイブル

スポンサーリンク

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のパフォーマンスチューニングの世界もすぐそこですよ。頑張ってくださいね!

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