◀ 16.

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

Db2の既存テーブルからCREATE TABLE等を取得するならdb2lookを使います。ただし、DDLを取得する操作と、別DBに適用する変更作業は分けます。

Db2のDDL抽出後に接続先と依存関係をレビューし隔離環境で適用結果を確認する図

この記事の要点
  • Db2(LUW)では db2look コマンドで既存テーブルの定義から CREATE TABLE 文などの DDL を生成できる
  • 基本形: db2look -d DB名 -e -o 出力ファイル名。認証方式と製品版を確認し、秘密値を引数に直書きしない
  • テーブルを絞るなら -t テーブル名(スペース区切りで複数、最大 30)、スキーマは -z スキーマ名
  • 索引・主キー・外部キー等は抽出範囲と依存先を確認する。完全な再現を保証しない。権限(GRANT)は -x、表スペースなどは -l
  • トリガーやプロシージャを含む場合は -td で文の区切り文字を変えると再実行しやすい

結論: db2look -e で DDL を出力する

直下は旧構文例です。実パスワードを埋めて転用しないでください。秘密値は履歴だけでなくプロセス引数や作業記録にも露出し得ます。変数に代入してから-wへ展開しても引数への露出は消えません。-i/-wをLUWの全接続で使える汎用の認証手段とせず、接続先/ツール版に対応する公式手順で確認してください。

db2look -d DB名 -e -i ユーザ名 -w パスワード -o 出力ファイル名

db2lookは定義をファイルへ抽出しますが、抽出成功だけで全DBオブジェクトが揃うわけではありません。指定するschema/表/作成者等の条件と、出力された対象を照合します。テーブルを指定する場合は、「-t」オプションの後にテーブル名を指定します(複数指定する場合はスペース区切り。最大数は 30 テーブル)。

# SALES スキーマの ORDERS と CUSTOMERS だけを出力する
db2look -d SAMPLEDB -e -z SALES -t ORDERS CUSTOMERS -o orders_ddl.sql

認証が成立すること、カタログ/対象を参照できること、出力先へ書けることは別条件です。実行のためだけにroot/インスタンス所有者へ切り替えたり、PUBLICへ権限付与したりしません。承認されたアカウントとクライアント環境を使い、カタログ参照に必要な権限を管理者へ確認します。Db2クライアントからの利用もあるため、DBサーバーへの管理者ログインを前提としません。

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公式11.5資料ではリモート接続/Db2 for z/OSの条件を伴う指定。LUWの一般的な秘密値入力方法として流用しない
-x権限DDLも抽出。-t/-tw利用時の依存オブジェクトの権限は別途-xdep等の範囲を確認
-l表スペース・バッファープール・パーティション・グループの DDL も出力する
-td 区切り文字文の区切り文字を変更する(既定はセミコロン)
-m統計情報を再現する UPDATE 文を出力する(実行計画の再現用)

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

具体的な手順

  1. 承認されたユーザーでDb2コマンド環境を開き、db2look -hでツール/オプションを確認する。OSユーザー切替を一律に要求しない
  2. アクセス制限された出力先を用意し、既存ファイルを失わない新しいファイル名を選ぶ
  3. DB別名・schema・表名・抽出範囲を照合してdb2lookを実行し、終了状態と診断出力を確認する
  4. 出力ファイルを開き、目的のテーブルの CREATE TABLE 文が含まれているか確認する

下の旧例のコメントには補足が必要です。-u/-aを指定しない場合の作成者条件にはUSER環境変数が関わるため、-z SALESだけで必ず「スキーマ全体」とは限りません。-zは別schemaの依存オブジェクトも制限し得ます。またTMP_%の_は任意の1文字なので、文字としてのTMP_接頭辞だけに限定できません。LIKEのescapeとシェルの引用を対象OSで確認し、対象を厳密に固定したい場合は既存の-t ORDERS CUSTOMERS例のように名前を列挙します。-td @は出力の区切り指定で、ルーチンが必ずすべて抽出される保証ではありません。

# スキーマ全体の 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/CONNECT RESET/COMMIT、schema/所有者、GRANT、DROPや設定/統計の変更文を点検し、検証用の接続先以外に到達しないようレビューします。採用していないオプションの出力まで必ず含むという意味ではなく、実際に出力された各文が点検対象です。

CLPのエラー停止-sは既定で無効です。旧例のようなファイル実行はSQLエラー後も続く場合があり、終了表示だけで全件成功と扱えません。-sを使っても既に完了したDDLを巻き戻す機能にはなりません。事前に承認した隔離環境で、区切り・自動コミット・途中失敗・再実行/復旧方針を検証します。

db2 connect to DEVDB
db2 -tvf orders_ddl.sql

# -td @ で出力した場合は区切り文字を合わせる
db2 -td@ -vf sales_with_routines.sql

表スペース名やschema名が異なる場合は、引用識別子・文字列・ルーチン本体を壊す全置換を避け、変更対象のDDLを個別にレビューします。依存関係(外部キーで参照される親テーブルなど)は db2look がある程度考慮した順序で出力しますが、一部のテーブルだけを抜き出した場合は、参照先のテーブルが存在せずにエラーになることがあります。

よくある落とし穴

  • テーブル名の大文字小文字: Db2 は引用符なしで作ったテーブル名をカタログに大文字で保存する。通常識別子と引用識別子を区別する。-tの入力処理もあるため、小文字指定が常に失敗すると決めつけず、カタログの正確な名前と対象版の引用規則に合わせる
  • 何も出力されない: 接続先、schema、表名、作成者条件、権限、エラー出力を順に確認する。空ファイルを「対象なし」と即断しない
  • 30 テーブルを超える: -t に指定できるのは最大 30。それ以上はスキーマ単位(-z)か -tw のパターン指定、または複数回に分けて実行する
  • 区切り文字の衝突: プロシージャやトリガーの本文にセミコロンが含まれるため、既定の区切り文字のままでは再実行時に文が途中で切れる。-td で別の文字にする
  • 接続先の製品を区別: 本文はLUW中心。db2lookにはz/OS等の接続先に関する機能/制限もあるため、「z/OSでは一切使えない」とも「LUWと同じ機能が使える」とも扱わない

確認方法

  • 出力ファイル内で CREATE TABLE "SALES"."ORDERS" のような文を検索し、列定義・主キー・索引が揃っているか確認する
  • 検証用のデータベースで出力ファイルを実行し、db2 describe table SALES.ORDERS で元の環境と列定義が一致するか比較する
  • カタログビュー SYSCAT.COLUMNS を両環境で検索し、列名・型・長さに差がないかを突き合わせる

関連

抽出結果のチェックリスト

  1. 抽出日時・ツール/DB製品版・DB別名・schema・対象名・オプション・終了状態を秘密値なしで記録する。生成物は内部構造/権限を含み得るため公開しない。
  2. 対象表数と正確な修飾名、列の型/長さ/NULL/DEFAULT/identity・生成列を照合する。CREATE TABLEが見つかっただけで完了にしない。
  3. 主キー・一意/検査/外部キー制約、索引、参照先の表、トリガー・シーケンス・型・ルーチン等の必要な依存先を確認する。-zの境界外や抽出除外の対象は別途確認する。
  4. 表スペース・ストレージ・ロール/権限、外部ルーチンのバイナリ等はDDLだけで持ち運べると仮定しない。-x/-l/-mを便利だからと一括で追加しない。
  5. 隔離した検証DBで各文の成否と最終カタログを比較する。失敗した途中状態に盲目的に再投入せず、確認済みの復旧手順を使う。

DDLファイルは行データやログを含む完全バックアップではありません。データ移送はEXPORT/IMPORT/LOAD等の対象版・権限・文字コード・整合性・停止時間を別途設計します。-mの統計再現もデータ複製ではなく、本番と同じ実行計画を保証しません。

Db2の関連:子ページから目的を選ぶ / テーブル定義の確認 / カタログからの列確認。元の関連節には他DBとの比較記事も残していますが、そこでの構文をDb2用と扱わないでください。

公式:db2lookの抽出条件/認証指定/制約 / 12.1の対象範囲 / CLPのエラー停止と実行オプション。掲載した既存構文は保持して注意を補いました。Db2実機での抽出/移行は未実施です。

子ページ

子ページはありません

同階層のページ
  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文を生成する方法

最近更新/作成されたページ