シリーズ総括

PART内容成果物
01CRUD図の目的・シリーズ概要
02静的解析 vs 動的解析・ツール選定アプローチ決定
03EXEC SQL〜END-EXEC 抽出実装ProgramSqlInfo リスト
04JSqlParser / 正規表現でCRUD分類CrudEntry リスト
05プログラム横断集約・行列構築CrudMatrixResult
06Markdown・Mermaid・PlantUML出力.md / .puml / .json
07サンプルプロジェクトでのデモ実際のCRUD図
08限界・改善点・移行活用(本記事)

静的解析の限界

⚠️ 静的解析で対応できないケース

EXECUTE IMMEDIATE — 文字列変数にSQL全体を代入して動的実行するパターン。変数の中身は実行時にしか確定しない。

WORKING-STORAGE での SQL 組み立てSTRING WS-SQL ' WHERE ' WS-COND DELIMITED SIZE INTO WS-STMT のような文字列連結。

COPY 句経由のSQLEXEC SQL COPY URIAGE-SELECT END-EXEC のようにCOPY句でSQL全体を取り込むパターン。COPY展開が必要。

実際の経験では、レガシーCOBOLの全SQLの 80〜90%は静的SQL であり、このツールだけでも十分な価値があります。

COPY句展開への対応

Python — COPY句の簡易展開
import re
from pathlib import Path

def expand_copy(source: str, copy_dir: str) -> str:
    """
    COPY句をコピーライブラリの内容に展開する(簡易版)。
    COPY ライブラリ名. → ライブラリファイルの内容に置換
    """
    copy_pattern = re.compile(
        r'^\s{6}\s+COPY\s+([A-Z][A-Z0-9-]*)\s*\.',
        re.IGNORECASE | re.MULTILINE
    )
    copy_base = Path(copy_dir)

    def replace_copy(m):
        lib_name = m.group(1).upper()
        for ext in ('.cpy', '.CPY', '.cbl', '.CBL'):
            lib_file = copy_base / (lib_name + ext)
            if lib_file.exists():
                return lib_file.read_text(encoding='cp932', errors='replace')
        return m.group(0)  # 見つからない場合はそのまま

    return copy_pattern.sub(replace_copy, source)

動的SQLへの対処

パターン登録
動的SQLが使われているプログラムを手動で特定し、CRUD情報をYAMLファイルに記録して静的解析結果にマージする。
コメントアノテーション
COBOLソースにコメントでテーブル・操作種別を記述する規約を設け、ツールがコメントを読み取る仕組みを追加する。
ログ解析の補完
テスト実行ログやDBアクセスログから動的SQLを補完し、静的解析結果とマージする。テスト環境が使える場合に有効。
COBOLパーサへの移行
koopa 等のCOBOLパーサを導入してASTレベルの解析に移行することで、より複雑なパターンにも対応できるようになる。

CI/CDへの組み込み

GitHub Actions — CRUD図生成ワークフロー
name: Generate COBOL CRUD Matrix

on:
  push:
    paths:
      - 'cobol_src/**/*.CBL'
      - 'cobol_src/**/*.cbl'

jobs:
  crud-gen:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'

      - name: Generate CRUD matrix
        run: |
          python -m pip install --quiet .
          python main.py

      - name: Commit CRUD matrix
        uses: stefanzweifel/git-auto-commit-action@v5
        with:
          commit_message: 'docs: update COBOL CRUD matrix [skip ci]'
          file_pattern: 'output/crud_matrix.*'

レガシー移行プロジェクトへの活用

このツールが最も力を発揮するのは、COBOL→Javaマイグレーション等のレガシー移行プロジェクトです。

移行対象の優先度付け
テーブルへのアクセス数が多いプログラムを可視化し、影響の大きいプログラムから計画的に移行する優先度付けに活用する。
Java版との比較検証
移行後のJava版CRUD図(Java版シリーズで生成)とCOBOL版を比較し、移行漏れ・操作種別の変化を検証できる。
テーブル廃止判断
どのプログラムからも参照されていないテーブルを洗い出し、不要テーブルの廃止候補を特定できる。
ドキュメント自動生成
CRUD図をMarkdownとしてGitHubリポジトリにコミットし続けることで、常に最新のドキュメントを自動維持できる。

次のステップ

さらに発展させるには

COBOL可視化シリーズとの統合COBOL可視化シリーズで生成したParagraph Call GraphとCRUD図を組み合わせることで「どのParagraphがどのテーブルにアクセスするか」という更に詳細な分析が可能になる。

Java版CRUD図との比較Java CRUD図生成シリーズと同じ出力形式(Markdown・Mermaid)を採ることで、COBOL版とJava版の移行対応状況を横並びで比較できる。

Webダッシュボード化 — JSON出力をJavaScriptで読み込みインタラクティブなフィルタ付き行列ビューとして提供することで、非エンジニアのステークホルダーへの説明資料として活用できる。