泥沼の依存関係を解き明かす:TableDefを駆使したリレーションシップ・グラフ解析の実践
Accessで「肥大化したシステム」を保守する際、最も恐ろしいのは何だと思うか?
それは、テーブル間の関係性が誰の頭の中にも存在せず、リレーションシップウィンドウを開けばスパゲッティのように線が交差する「ブラックボックス化した依存関係」だ。
GUIで確認できるのはせいぜい数十個のテーブルまで。数百規模のエンティティが絡み合うシステムにおいて、ドキュメントなき変更は死を意味する。今日は、DAOの`TableDef`と`Relation`オブジェクトを深掘りし、その複雑怪奇な依存構造をツリー構造として可視化する「アーキテクチャ・スキャナ」を構築する。
1. なぜ「DAOの深淵」に潜る必要があるのか
ADOではなくDAOを選択する理由は明白だ。Accessのスキーマ情報は、DAOの`TableDefs`コレクションに物理的に埋め込まれている。`Relation`オブジェクトの`ForeignTable`と`Table`プロパティを再帰的にトレースするだけで、依存のグラフは抽出できる。
ただし、注意が必要だ。VBAのオブジェクト管理を怠れば、メモリリークは必然。「参照したら解放する」。この鉄則を忘れたエンジニアに、大規模開発の資格はない。
2. 依存関係解析エンジン:核心コード
このツールは、指定したテーブルを起点に、その親(依存先)と子(依存元)を再帰的に辿り、インデント付きテキストで出力する。
‘ 依存関係を再帰的に抽出するエンジン
‘ 厳密なメモリ管理のため、オブジェクトは必ずNothingで解放する
Public Sub VisualizeRelationships(ByVal startTableName As String, Optional ByVal indent As Integer = 0)
Dim db As DAO.Database
Dim rel As DAO.Relation
Dim fld As DAO.Field
Dim i As Integer
Set db = CurrentDb
‘ インデント文字列の生成(パフォーマンスを考慮し簡略化)
Dim prefix As String
prefix = String(indent, ” “)
Debug.Print prefix & “Table: ” & startTableName
‘ リレーションシップを走査
For Each rel In db.Relations
‘ 指定テーブルを外部キーとして持つテーブルを抽出(親への依存)
If rel.ForeignTable = startTableName Then
Debug.Print prefix & ” └─ [Depends on] -> ” & rel.Table
‘ 再帰的に深掘りする(循環参照防止のロジックをここに加えるのがプロの仕事だ)
VisualizeRelationships rel.Table, indent + 2
End If
Next rel
‘ 明示的解放:これがメモリリークを防ぐ唯一の作法
Set rel = Nothing
Set db = Nothing
End Sub
3. シニアエンジニアが意識すべき「極限の知見」
上記のコードは氷山の一角に過ぎない。実戦投入する際には、以下の「壁」を乗り越える必要がある。
① 循環参照(Circular Dependency)の検知
テーブルAがBに依存し、BがAに依存する場合、再帰関数はスタックオーバーフローを引き起こす。解析済みテーブルを`Scripting.Dictionary`に格納し、スタックに入っているかを確認する「訪問済みフラグ(Visited Flag)」の実装が必須だ。
② Windows APIによる高速出力
もし解析結果が数万行に及ぶなら、`Debug.Print`では遅すぎる。`Kernel32.dll`の`WriteFile`を用いてバッファへ直接書き出すか、`ADODB.Stream`を用いてメモリ上で完結させるのが、IOボトルネックを回避するアーキテクトの流儀だ。
③ 隠れた依存:クエリと非連結フォーム
`Relation`オブジェクトは物理的な制約(参照整合性)しか示さない。しかし、Accessには「クエリのSQL内でJOINされている」という論理的な依存が存在する。`QueryDefs`を正規表現(RegExp)でパースし、テーブル名が含まれているかをチェックするモジュールを別途用意せよ。これにより、真の依存グラフが完成する。
4. 最後に:技術は「管理」のためにある
コードを書くことが目的ではない。このツールの真の価値は、「どのテーブルを削除してもシステムが壊れないか」というインパクト解析(Impact Analysis)を瞬時に行うことにある。
大規模なAccessシステムは、いわば巨大な生き物だ。その神経系であるリレーションを可視化できれば、リファクタリングの恐怖は消え去る。
君たちが保守するそのシステムは、まだ救えるはずだ。DAOを掌握し、メモリを管理し、システムの脈動をその目で確かめてみてほしい。健闘を祈る。
