作業ノート

様々なまとめ、雑感など

SchemaSpyでOracle DBのドキュメントを作成する

SchemaSpyは、データベースのスキーマ情報を解析して、htmlで出力するツール。javaで書かれている。

必要なのもの

  • java5 以上
  • SchemaSpyのjarファイル(schemaSpy_5.0.0.jar)
  • 解析したいデータベースのjdbcドライバー
  • Graphviz

OSはCentOS 5.7で、Oracle DBで試してみた。

OracleJDBCドライバー

今回試した環境には、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オプションは、それらを抑制するためのオプション。

今回、このような解析結果は必要なかったので、抑制した。

参考