DB2でEXPLAIN表が消せない
今日DB2でスキーマを整理する為に、
いくつかの不要になったスキーマを削除する事になりました。
手順としては削除対象のスキーマのテーブルとシーケンスを削除してスキーマを削除します。
全てのテーブルを削除する特別なコマンドはないようなので、
DB2のコマンドエディタで下記のコマンドをリダイレクトして、
テキストに出力して整形してDDLを作成しました。
テーブル一覧はこんな感じで取得。
db2 LIST TABLE > table.list
シーケンスは普通に検索して、これもエディタで整形してDDLを作成しました。
SELECT SEQNAME FROM SYSCAT.SEQUENCES WHERE SEQSCHEMA = 'スキーマ名'
サクラエディタで正規表現等をフル活用で力技で作りました(笑)
それを流して一括で消して終わるつもりだったのですが、
そこで問題が発生しました。
あるスキーマがEXPLAIN表を作っていて、
その中の2つのテーブルが削除できませんでした。
削除できなかったテーブルは下記のテーブル
EXPLAIN_DIAGNOSTIC EXPLAIN_DIAGNOSTIC_DATA
削除時に出たエラーはこんな感じ
[IBM][CLI Driver][DB2/NT] SQL0478N オブジェクト・タイプ "TABLE" は、 このオブジェクトに従属するタイプ "FUNCTION" のオブジェクト "スキーマ名.EXPLAIN_GET_MSGS" が存在するため、 DROP、ALTER TRANSFER OWNERSHIP、または REVOKE できません。 SQLSTATE=42893
カタログ表の「SYSCAT.TABLES」を検索してみると、
テーブルがあってデータは空っぽの状態でした。
そこでエラー内容を良く見てみたら「ファンクションのオブジェクト」とあるので
このキーワードで検索してみたら、これは*1UDFというものでした。
これを削除するコマンドもちゃんとありました。
DROP FUNCTION EXPLAIN_GET_MSGS
これを削除した後に、EXPLAIN表を再度削除してみたらキレいに消えました。
そして最後にやっとスキーマの削除をする事ができました。
DROP SCHEMA スキーマ名 RESTRICT
スキーマの削除はなかなか大変だ\(;゚∇゚)/