◀ 16.

【DB2】テーブル定義からDDL(CREATE TABLE)を生成する方法

この記事の要点
  • Db2(LUW)では db2look コマンドで既存テーブルの定義から CREATE TABLE 文などの DDL を生成できる
  • 基本形: db2look -d DB名 -e -o 出力ファイル名(必要なら -i ユーザー名 -w パスワード)
  • テーブルを絞るなら -t テーブル名(スペース区切りで複数、最大 30)、スキーマは -z スキーマ名
  • 索引・主キー・外部キーなども一緒に出力される。権限(GRANT)は -x、表スペースなどは -l
  • トリガーやプロシージャを含む場合は -td で文の区切り文字を変えると再実行しやすい

結論: 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名対象のデータベース名(必須)
-eDDL を抽出する(CREATE TABLE、索引、制約、ビューなど)
-z スキーマ名対象スキーマを指定する
-t 表名1 表名2 ...対象テーブルを指定する(最大 30)
-tw パターンテーブル名をパターンで指定する(% や _ のワイルドカード)
-o ファイル名出力先ファイル。省略すると標準出力に出る
-i / -w接続ユーザー名 / パスワード
-xGRANT 文(権限)も出力する
-l表スペース・バッファープール・パーティション・グループの DDL も出力する
-td 区切り文字文の区切り文字を変更する(既定はセミコロン)
-m統計情報を再現する UPDATE 文を出力する(実行計画の再現用)

使えるオプションは Db2 のバージョンによって増減があります。db2look -h で、使っている環境のヘルプを確認してください。

具体的な手順

  1. Db2 のコマンドを実行できる環境を開く(Linux / UNIX ではインスタンス所有者でログイン、Windows では「DB2 コマンド・ウィンドウ」を開く)
  2. 出力先ディレクトリに移動する
  3. 必要なオプションを付けて db2look を実行する
  4. 出力ファイルを開き、目的のテーブルの 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 を両環境で検索し、列名・型・長さに差がないかを突き合わせる

関連

Post Share
子ページ

子ページはありません

同階層のページ
  1. DB接続コマンド
  2. データベース一覧の確認
  3. テーブル一覧の確認
  4. テーブル定義の確認
  5. DBの設定確認
  6. テーブルスペースの容量の確認および拡張
  7. データ型
  8. 複数カラムのUPDATE
  9. カラムの追加/削除/変更
  10. 自動番号付け (autoincrement) する方法
  11. インデックスの作成
  12. シーケンスおよびインクリメント(ID列)の違いと確認方法
  13. create table文の生成
  14. 特定スキーマの全テーブルの全カラム情報を取得する方法
  15. 【DB2】エラー一覧
  16. 【DB2】テーブル定義からCREATE TABLE文を生成する方法