CRUD図とは

CRUD図(CRUD Matrix)とは、システム内の各機能・モジュール・プログラムが、どのテーブルに対して Create(挿入)・Read(参照)・Update(更新)・Delete(削除) のどの操作を行うかを一覧化した図です。

縦軸にプログラム/モジュール、横軸にテーブルを並べた行列(マトリクス)形式が最も一般的で、各セルに C / R / U / D を組み合わせた記号を書き入れます。

CRUD図 — Markdownテーブル例
| プログラム / テーブル | TOKUI  | SHOHIN | URIAGE | MEISAI |
|-----------------------|--------|--------|--------|--------|
| URIAGE-TOROKU         | R      | R      | CU     | CRD    |
| URIAGE-SHUKEI         | R      | R      | R      | R      |
| SHOHIN-KANRI          |        | CRUD   |        |        |
| TOKUI-MEISHO          | CRUD   |        |        |        |

上表から「URIAGE-TOROKUMEISAI テーブルの Create・Read・Delete を行う」「URIAGE-SHUKEI はすべてのテーブルに対して Read のみ」といった依存関係が一目でわかります。

COBOLでCRUD図が必要な理由

CRUD図はJava等のモダン言語に限らず、COBOLシステムでこそ特に力を発揮します。

影響調査
テーブルの列追加・削除・リネームを行うとき、どのCOBOLプログラムに修正が波及するかを即座に把握できる。
引き継ぎ・レビュー
何千本ものCOBOLプログラムが存在するレガシー環境で、新担当者へのデータアクセス全体像を短時間で伝えられる。
移行計画
COBOL→Javaマイグレーションやクラウドリフト時、テーブルを参照しているプログラムを漏れなく特定できる。
設計検証
「更新すべきでないバッチが DELETE している」「同一テーブルへの二重更新がある」などの設計崩れを発見できる。

COBOLにおけるSQLの書き方

COBOLでRDBにアクセスする場合、埋め込みSQL(Embedded SQL)を使います。 SQL文は EXEC SQLEND-EXEC で囲まれたブロックとして記述されます。 これはJavaのようにメソッド内に自由な形で記述するのとは異なり、 COBOLでは明確な開始・終了マーカーが常に存在するという大きな特徴があります。

COBOL — 埋め込みSQL の例
       PROCEDURE DIVISION.
       MAIN-PROC.
           EXEC SQL
               SELECT TOKUI-CD, TOKUI-NM
               INTO :WK-TOKUI-CD, :WK-TOKUI-NM
               FROM TOKUI
               WHERE TOKUI-CD = :WK-INPUT-CD
           END-EXEC.

           EXEC SQL
               INSERT INTO URIAGE
                   (URIAGE-NO, TOKUI-CD, URIAGE-DT, KIN-GAK)
               VALUES
                   (:WK-URIAGE-NO, :WK-TOKUI-CD,
                    :WK-DATE, :WK-KINGAK)
           END-EXEC.

💡 EXEC SQL ブロックの特徴

Java と異なり、COBOL の SQL はすべて EXEC SQLEND-EXEC で囲まれています。この構造的な特徴により、正規表現だけでも高精度にSQL文を抽出できます。動的SQL(EXECUTE IMMEDIATEや文字列連結)は例外で、PART 08 で対策を解説します。

既存ツールの限界

ツール / アプローチ依存するもの問題点
手動作成 数千本のCOBOLプログラムに対して現実的でなく、コード変更のたびに陳腐化する
COBOLパーサー製品 特定ベンダー環境 高価・環境依存が強く、オープンな分析環境を構築しにくい
実行ログ解析(動的) DB接続・テスト環境 未実行コードパスは解析されず、テスト環境の整備コストも高い
Javaツール流用 JavaParser等 COBOL固有の構文(EXEC SQL、固定形式、継続行)に対応しない

このシリーズのアプローチ

本シリーズでは COBOLソースコードの静的解析 によるアプローチを採ります。 EXEC SQL〜END-EXEC ブロックを正規表現で抽出し、 JSqlParser でテーブル名と操作種別を判別します。 特定ベンダーやランタイム環境に依存せず、COBOLソースファイルさえあれば解析可能です。

シリーズ全体構成

PARTタイトル内容
01はじめに(本記事)CRUD図の目的・シリーズ概要
02アプローチの設計COBOLの静的解析・ツール選定(正規表現 vs パーサ)
03SQL抽出の実装EXEC SQL〜END-EXECブロックのスキャンと取り出し
04テーブル名・操作種別の判別JSqlParser / 正規表現でCRUD分類
05CRUD行列の構築プログラム横断集約とデータ構造設計
06CRUD図の出力Markdownテーブル・Mermaid・PlantUML
07動作デモサンプルCOBOLプロジェクトで実際に動かす
08まとめ限界と改善点・レガシー移行への活用

使用技術スタック

Python(正規表現)
EXEC SQL〜END-EXECブロックのスキャンに使用。COBOLの固定形式・継続行を考慮したパターンで高精度抽出を実現する。
JSqlParser
抽出したSQL文字列を解析してAST(Statement)に変換。SELECT/INSERT/UPDATE/DELETEのテーブル名を安全に取得できる。
Mermaid
Markdown内でCRUD図をレンダリングするDSL。GitHub・Notion・Confluenceで直接表示できる。
PlantUML
より高機能な表現が必要な場合のオプション出力先。大量プログラム×テーブルの行列表現に向いている。

次の章では…

PART 02 では静的解析と動的解析のトレードオフを整理し、正規表現ベースとCOBOLパーサ(koopa / GnuCOBOL)のどちらを選ぶべきかを詳しく解説します。

→ PART 02 — アプローチの設計へ