Pocket

こんにちはNitです。

DBとのやり取りをするプログラムを組んでいると、
たまに「アレ、このテーブルどこで使っていたっけ」とか、
「このテーブルにカラムを追加したいんだけど、他に影響あるかな」
とかを調べたくなる事があります。

そんな時、設計書のファイル形式が統一されていれば、ツールを使って設計書内をgrepし、
テーブル名が出てくる箇所を検索したりもしますが、
たまーに物凄く古い設計書なんかは信用できない時があるので、
プログラムのソースファイルを直接grepすることが多いです。
ソースファイルはテキストファイルと同様、grep機能のついているテキストエディタや、
Eclipse上等でもgrepすることが出来ます。

(grep:元はUNIXのファイル内文字列検索コマンドのこと。
一般的に・・・かどうかは分かりませんが、
UNIX上でなくてもファイル内文字列検索をよく「grepする」と言います。)

但し、普通にgrepすると関係の無いものまで大量に表示され、
それを1件1件見ていったら時間がかかります。
なので、grep結果を一度新しいテキストファイルに貼り付けたら、
不要そうなものをざっくり削除していきます。

■例 javaのソースを「tableA」をキーワードにしてgrepした場合

↓テーブル名として使用されていないので削除
C:\source\tableAClass.java X行目  class tableAClass {
C:\source\tableAClass.java X行目  private StingBuffer sqlTableA = new StringBuffer();
↓コメントなので削除
C:\source\tableAClass.java X行目  * tableA を更新する機能のjavadoc
C:\source\tableAClass.java X行目  // tableA を更新する
↓テーブル名として使用されているので残す
C:\source\tableAClass.java X行目  sqlTableA.append(" SELECT * FROM TABLEA");
C:\source\tableAClass.java X行目  sqlTableA.append(" select * from tableA");
↓テーブル名として使用されているかもしれないので残す
C:\source\tableAClass.java X行目  table_name_kamoshirenai = "tableA";
C:\source\tableAClass.java X行目  sqlTableA.append(" tableA");

こうしてみていきますと、SQLはプログラム内では大抵文字列として扱われていますので、
grep結果を貼り付けたテキストファイルを保存し、さらに以下の正規表現でgrepを行うと、
テーブル名として使用されているっぽい行を抜き出すことが出来そうです。

該当箇所のみ:\"[\w ]*tablea[\w ]*\"
行全体   :^.*\"[\w ]*tablea[\w ]*\".*$
(大文字小文字の区別なしで検索)

ただし!
プロパティファイル等に直接SQLが書かれているのを見つけた場合、
上記の正規表現では抜き出せないので、そこはgrep結果1行1行確認するしかないと覚悟を決めます。

さらに「SELECT文はどうでもいい。更新している所のみ知りたい。」という場合には、
以下のものも削除できます。

↓条件式なので削除
C:\source\tableAClass.java X行目  sql.append(" TABLEA.ID = TABLEB.ID");
("DELETE FROM TABLEA"、"INSERT INTO TABLEA"、"UPDATE TABLEA"
 といった文頭をチェック対象にすれば良い)

此方については、余り無いパターン(大抵条件式のテーブル名は別名を使う)なので、
私は手で削除しています^^;

ここまででざっくり削ったら、後は広大なプログラムの海に船出するのみです。
胸が躍りますね。・・・多分。

Nitでした。