Accessの深淵を可視化せよ:Relationオブジェクトを掌握するリレーションシップ・マッピング技術
Access開発が泥沼化する最大の要因は、テーブル間の依存関係が「誰の頭の中にしかない」状態にあることだ。GUIのリレーションシップウィンドウは、テーブル数が増えるごとにスパゲッティと化し、結局何の役にも立たなくなる。
真のプロフェッショナルは、GUIに頼らない。DAOの`Relation`オブジェクトをコードで走査し、システムが抱える構造的負債を客観的な「データ」として抽出するのだ。
今日は、Accessの複雑怪奇なリレーションシップを可視化し、ドキュメント化を自動化するアーキテクチャを伝授する。
—
1. なぜ「DAO.Relation」を直接叩く必要があるのか
Accessのデータベースエンジン(ACE)は、リレーションシップ情報を`Database.Relations`コレクションに保持している。これをループ処理で解析することは、以下のメリットがある。
- 依存関係の網羅: GUIで表示しきれない、隠れたリレーションも全て抽出できる。
- 整合性チェック: 参照整合性(Referential Integrity)が設定されていない「野良リレーション」を即座に特定できる。
- ドキュメント自動生成: 開発ドキュメントを常に最新の状態に保つための「脱属人化」ツールとして機能する。
—
2. 堅牢なリレーションシップ抽出エンジン
以下のコードは、単に情報を出すだけではない。「どのフィールドが、どのテーブルのどのフィールドを指しているか」を、外部ツール(Mermaid記法など)で解析可能な形式で抽出する。
プロダクションコード:ExportRelationMap
このコードを標準モジュールに配置し、イミディエイトウィンドウに出力結果を吐き出す設計にしている。
Option Compare Database
Option Explicit
‘ @description データベース内の全Relationを走査し、Mermaid形式の依存関係図を出力する
‘ @author Chief Architect
Public Sub ExportRelationMap()
Dim db As DAO.Database
Dim rel As DAO.Relation
Dim fld As DAO.Field
Dim output As String
Set db = CurrentDb
‘ Mermaid記法の開始
Debug.Print “erDiagram”
For Each rel In db.Relations
‘ 外部キー制約の有無を確認
Dim integrity As String
integrity = IIf((rel.Attributes And dbRelationUpdateCascade) <> 0, ” ||–o{ “, ” |o–o{ “)
‘ 複雑な依存関係を一行ずつ解析
For Each fld In rel.Fields
‘ [親テーブル] –[関係]–> [子テーブル] : [フィールド名]
Debug.Print ” ” & rel.Table & integrity & rel.ForeignTable & ” : “”” & fld.Name & “”””
Next fld
Next rel
Debug.Print “— 抽出完了: 上記をMermaid Live Editorに貼り付けてください —”
End Sub
—
3. 実務で「死なない」ためのアーキテクチャ設計
このツールを業務に組み込む際、以下の3点に注意を払わないエンジニアは二流だ。
A. 循環参照と再帰の恐怖
テーブル構造が複雑化すると、循環参照が発生する可能性がある。上記コードは単純なループだが、もしこれを「依存グラフ」としてメモリに保持する場合は、必ず訪問済みノードのフラグ管理(Dictionaryオブジェクト等)を行い、無限ループを防止すること。
B. カスケード削除・更新の可視化
リレーションの`Attributes`プロパティには、`dbRelationDeleteCascade`や`dbRelationUpdateCascade`といったフラグがビット演算で格納されている。これらを無視して設計すると、データ削除時に意図せぬ連鎖削除が起きる。ツールを拡張する際は、`Attributes`を解析して「カスケード有無」を明示的に出力するように改良せよ。
C. 実行環境の分離
このツールは、本番環境ではなく「開発用コピー」に対して実行すること。DAOは強力だが、テーブル定義を動的に変更するようなツールを作る場合、万が一の誤動作はDBの死を意味する。権限管理と実行ログの保持は必須である。
—
4. 伝説のエンジニアからのアドバイス
「なぜこの機能がAccess標準にないのか?」と不満を漏らすのは簡単だ。だが、「足りない機能は自ら実装する」のがAccess VBAエンジニアの矜持である。
今回提供したスクリプトは、単なるテキスト出力ツールではない。これを起点に、以下のようなステップアップを推奨する。
1. JSON出力: `Scripting.Dictionary`を活用し、JSON形式でエクスポートしてWebフロントエンドで可視化する。
2. 自動ドキュメント生成: Wordのテンプレートに流し込み、仕様書を自動作成する。
3. 整合性監査: 名前付け規則に従っていないリレーションを検出し、警告を出す「静的解析ツール」へと昇華させる。
Accessを単なる「事務用ツール」で終わらせるか、高度なデータ管理システムにまで引き上げるか。それは、あなたがリレーションシップという「データベースの血管」をどれだけ正確に可視化できるかにかかっている。
さあ、コードを書いてシステムを掌握せよ。
