DB2 でIDENTITY列(オートインクリメント列)を含むテーブルをSQLで抽出する方法
DB2のデータのEXPORT AND LOAD時、カラムにIDENTITY列(オートインクリメント)が存在する場合、ロードはエラーになってしまいます。その場合、LOADのオプションで、identityoverrideを指定することで、IDENTITY列を上書きロードしてくれるのですが、対象のデータベース内に、数百、数千のテーブルが存在する場合、結構探すのに苦労してしまうと思うのです。
それをSQLで求めれば一発でわかるよという話です。
- ちなみにSQLはこんな感じで実行すると、結果がでます
$ db2 "select TABSCHEMA,TABNAME,COLNAME,IDENTITY,GENERATED from syscat.columns where IDENTITY = 'Y'" TABSCHEMA TABNAME COLNAME IDENTITY GENERATED DB2ADMIN TAB1 ID Y A DB2ADMIN TAB2 ID Y A DB2ADMIN TAB3 ID Y A DB2ADMIN TAB4 ID Y A
これだけだとつまらないので、SQLでさらに加工すれば、identityoverrideを含んだLOAD文を生成できます。$ db2 -x "select 'load from ' || rtrim(TABSCHEMA) || '.' || rtrim(TABNAME) || '.ixf of IXF modified by identityoverride REPLACE ' || rtrim(TABSCHEMA) || '.' || rtrim(TABNAME) || ' NONRECOVERABLE' as LOAD_SQL from syscat.columns where IDENTITY = 'Y'" > /tmp/load.sql; cat /tmp/load.sql
上記の出力結果
load from DB2ADMIN.TAB4.ixf of IXF modified by identityoverride REPLACE DB2ADMIN.TAB4 NONRECOVERABLE load from DB2ADMIN.TAB1.ixf of IXF modified by identityoverride REPLACE DB2ADMIN.TAB1 NONRECOVERABLE load from DB2ADMIN.TAB2.ixf of IXF modified by identityoverride REPLACE DB2ADMIN.TAB2 NONRECOVERABLE load from DB2ADMIN.TAB3.ixf of IXF modified by identityoverride REPLACE DB2ADMIN.TAB3 NONRECOVERABLE
細かいオプションは別として、SYSCATVIEWを利用して、SQL文を生成する手法は結構便利なので、いろいろと応用することができます。
- 余談ですが、正式なロードの構文は以下のような感じになると思います。NONRECOVERABLE オプションは、ロードがエラーになっても、バックアップペンディングにならないよ!というオプションです。
$ db2 "load from tab1.ixf of ixf modified by identityoverride REPLACE into tab1 NONRECOVERABLE"
以上そんなところで・