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

スキーマの削除はなかなか大変だ\(;゚∇゚)/

*1:ユーザー定義関数 Oracleでいうストアドファンクション