タイトル: 【DB2】テーブル定義からCREATE TABLE文を生成する方法
SEOタイトル: 【DB2】テーブル定義からDDL(CREATE TABLE)を生成する方法
| この記事の要点 |
|
結論: db2look -e で DDL を出力する
db2look -d DB名 -e -i ユーザ名 -w パスワード -o 出力ファイル名
このコマンドで、データベース内のテーブル定義が CREATE TABLE 文として出力ファイルに書き出されます。テーブルを指定する場合は、「-t」オプションの後にテーブル名を指定します(複数指定する場合はスペース区切り。最大数は 30 テーブル)。
# SALES スキーマの ORDERS と CUSTOMERS だけを出力する
db2look -d SAMPLEDB -e -z SALES -t ORDERS CUSTOMERS -o orders_ddl.sql
DB サーバー上でインスタンス所有者などのユーザーとしてログインしている場合は、-i と -w を省略してもローカル接続の権限で実行できます。パスワードをコマンドラインに書くとシェルの履歴に残るため、可能な限り省略する運用がおすすめです。
db2look とは
db2look は、Db2 for Linux, UNIX and Windows(LUW)に付属するコマンドで、データベースのカタログ情報を読み取って DDL(データ定義言語)や統計情報の更新文を生成します。主な用途は次のとおりです。
- 本番環境と同じテーブル構造を、開発・検証環境に再現する
- 別サーバーへの移行時に、スキーマ定義だけを先に作る
- 設計書と実際のテーブル定義に差がないかを確認する
- 変更作業の前に、現在の定義をバックアップとして残す
データ(行)は出力されません。データも移す場合は、EXPORT / IMPORT や LOAD、db2move などと組み合わせます。
主なオプション
| オプション | 意味 |
|---|---|
| -d DB名 | 対象のデータベース名(必須) |
| -e | DDL を抽出する(CREATE TABLE、索引、制約、ビューなど) |
| -z スキーマ名 | 対象スキーマを指定する |
| -t 表名1 表名2 ... | 対象テーブルを指定する(最大 30) |
| -tw パターン | テーブル名をパターンで指定する(% や _ のワイルドカード) |
| -o ファイル名 | 出力先ファイル。省略すると標準出力に出る |
| -i / -w | 接続ユーザー名 / パスワード |
| -x | GRANT 文(権限)も出力する |
| -l | 表スペース・バッファープール・パーティション・グループの DDL も出力する |
| -td 区切り文字 | 文の区切り文字を変更する(既定はセミコロン) |
| -m | 統計情報を再現する UPDATE 文を出力する(実行計画の再現用) |
使えるオプションは Db2 のバージョンによって増減があります。db2look -h で、使っている環境のヘルプを確認してください。
具体的な手順
- Db2 のコマンドを実行できる環境を開く(Linux / UNIX ではインスタンス所有者でログイン、Windows では「DB2 コマンド・ウィンドウ」を開く)
- 出力先ディレクトリに移動する
- 必要なオプションを付けて db2look を実行する
- 出力ファイルを開き、目的のテーブルの CREATE TABLE 文が含まれているか確認する
# スキーマ全体の DDL と権限を出力
db2look -d SAMPLEDB -e -z SALES -x -o sales_full.sql
# 名前が TMP_ で始まるテーブルだけ
db2look -d SAMPLEDB -e -z SALES -tw TMP_% -o tmp_tables.sql
# トリガーやプロシージャを含むので区切り文字を @ にする
db2look -d SAMPLEDB -e -z SALES -td @ -o sales_with_routines.sql
出力したDDLを別環境で実行する
出力ファイルの先頭には CONNECT TO 文が含まれます。別のデータベースに作成する場合は、接続先の名前を書き換えるか、その行を削除してから実行します。
db2 connect to DEVDB
db2 -tvf orders_ddl.sql
# -td @ で出力した場合は区切り文字を合わせる
db2 -td@ -vf sales_with_routines.sql
表スペース名やスキーマ名が移行先で異なる場合は、実行前に置換しておきます。依存関係(外部キーで参照される親テーブルなど)は db2look がある程度考慮した順序で出力しますが、一部のテーブルだけを抜き出した場合は、参照先のテーブルが存在せずにエラーになることがあります。
よくある落とし穴
- テーブル名の大文字小文字: Db2 は引用符なしで作ったテーブル名をカタログに大文字で保存する。
-t ordersではなく-t ORDERSと大文字で指定する - 何も出力されない: スキーマ名(-z)の指定漏れや誤り、接続ユーザーにカタログを参照する権限がないことが多い
- 30 テーブルを超える: -t に指定できるのは最大 30。それ以上はスキーマ単位(-z)か -tw のパターン指定、または複数回に分けて実行する
- 区切り文字の衝突: プロシージャやトリガーの本文にセミコロンが含まれるため、既定の区切り文字のままでは再実行時に文が途中で切れる。-td で別の文字にする
- Db2 for z/OS は別: db2look は LUW 向けのコマンド。z/OS では別のツールで DDL を生成する
確認方法
- 出力ファイル内で
CREATE TABLE "SALES"."ORDERS"のような文を検索し、列定義・主キー・索引が揃っているか確認する - 検証用のデータベースで出力ファイルを実行し、
db2 describe table SALES.ORDERSで元の環境と列定義が一致するか比較する - カタログビュー
SYSCAT.COLUMNSを両環境で検索し、列名・型・長さに差がないかを突き合わせる