SchemaSpyでOracle DBのドキュメントを作成する
SchemaSpyは、データベースのスキーマ情報を解析して、htmlで出力するツール。javaで書かれている。
必要なのもの
OSはCentOS 5.7で、Oracle DBで試してみた。
OracleのJDBCドライバー
今回試した環境には、Oracle Instant Clientがすでに入っていたので、その中にあるjdbドライバを使った。
具体的には
$ORACLE_HOME/jdbc/lib/ojdbc5.jar
を使用した。
Graphviz
これも、すでにインストールされていた。
CentOS 5.7なら、yumで検索するとgraphvizがリストアップされるので、それをインストールすればOK。
データベースへの接続方法
$ java -jar schemaSpy_5.0.0.jar -dbhelp
を実行すると-t
で指定するDBのタイプと、タイプごとに必要なオプションが表示される
ora:
Oracle with OCI8 Driver
-db database name (from TNSNAMES.ORA)
orathin:
Oracle with Thin Driver
-host database host
-port port on database host
-db database SID as known on host
Oracleの場合、接続方法は2つ。一つは-t ora
で、tnsnames.oraを使って接続する方法。もうひとつは-t orathin
で、ホスト名、ポート、SIDを指定して接続する方法。
シェルスクリプト
いろいろ試しながらシェルスクリプトにしてみた。
以下が、そのサンプル。このスクリプトと同じディレクトリにschemaSpy_5.0.0.jarがある。
tnsnames.oraで接続するスクリプト
ホスト名、ポート、SIDで接続するスクリプト
留意点
-db
オプションの値
-db
オプションの値は、接続方法によって異なる。
-t ora
のときは、tnsnameを指定する-t orathin
のときは、SIDを指定する
-port
オプションは必ずつける
Oracleの場合はデフォルトで1521。
接続先はデフォルトのままなので、-port
オプションを指定せずに実行したら、エラーになった。
設定上ポートが必要な場合、たとえデータベースのデフォルトのポートであっても、-port
オプションを指定しないといけないらしい。
-s
オプションに与えるスキーマ名は大文字で
スキーマ名はユーザ名と同じ。しかし、ユーザ名をそのまま指定して実行したら、スキーマが見つからないというエラーがでた。
スクリプトではtrコマンドを使って大文字に変換している。
データベースの文字コードを-charset
オプションで指定する
最初試したとき、解析結果のテーブルのコメントが文字化けしていた。
データベースの文字コードがEUC-JPで、それをUTF-8として解析していたようなので、-charset
オプションでEUC-JPを指定すると、文字化けしなくなった。
特定のテーブルを除外する
解析したデータベースに、テーブル名_121108_1
のような、バックアップと思われるテーブル名があった。
これを除外するために、スクリプトでは-I
オプションを指定した。この値は正規表現で、それに一致するテーブルを、対象から除外する。
解析の抑制
SchemaSpyで解析すると、テーブル構造、ビュー、制約などの解析結果がhtmlで出力されるが、併せて
- 各テーブルのレコード数を算出する
- カラム名からリレーションを暗黙的に導き出す
といった解析を行う。-norows
,-noimplied
オプションは、それらを抑制するためのオプション。
今回、このような解析結果は必要なかったので、抑制した。