- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:DB2でUNIQUE制約を削除したい)
DB2でUNIQUE制約を削除したい
このQ&Aのポイント
- DB2で明示的な名前のないUNIQUE制約を削除する方法について教えてください。
- 制約名を指定せずにALTER TABLE文でUNIQUE制約を削除することはできるのか検討しています。
- syscat.tabconstカタログで自動でつけられた制約名を調べずに、簡単にUNIQUE制約を削除する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
OS名、DB2のバージョンは、何でしょうか? >DB2のストアドプロシージャでは動的にDDL文を組み立てて実行することができないよう ちょっと信じがたいのですが、「EXECUTE IMMEDIATEの実行不可」と言ってますか? 別にストアドプロシジャじゃなくても、いいのですよ。 システムカタログを検索して、テキストファイルに書き出すのでもいいのです。 書き出すときに、 'ALTER TABLE TEST DROP CONSTRAINT "' 検索で得た制約名 '";' を文字列で組み立てて、ALTER TABLE文を作ればいいのです。 これを実行すれば、目的は達成できませんか?
その他の回答 (1)
- chukenkenkou
- ベストアンサー率43% (833/1926)
回答No.1
DB2に限った話ではないですが、一般的な考え方としては、次のどちらかでは? (1)制約名を明示的に付ける。 (2)制約名を意識したくないなら、システムカタログを検索して名称を得て、ALTER PROGRAM文を文字列で生成し、実行するストアドプロシジャを作る。
質問者
補足
ご指摘のとおり、新規のシステムには制約名を明示的につけているのですが、古いシステムにかなりの数の制約が名前なしで生成されているのです。 DB2のストアドプロシージャでは動的にDDL文を組み立てて実行することができないようなので困っていました。 もし、DB2で動的にDDLを実行できる方法あればご教授いただける助かります。
お礼
JAVAプログラムで制約名を取得してから、ALTER TABLE文を作成して実行する方法で解決しました。 どうもありがとうございました。
補足
chukenkenkouさん、 回答いただき、ありがとうございます。 環境はDB2/LINUX 8.2.7 です。 前提として、保守用のSQLテキストスクリプト内にSQL文を記述して実行 しているので、制約名を知らべてから動的にSQL文を組み立てて実行、という処理が保守用のSQLテキストスクリプト内で完結できるかどうか調べていました。外部のプログラム言語は使わないというのが前提です。 もし"EXECUTE IMMEDIATE"で動的SQLの実行が、SQLのストアドプロシージャか、BEGIN ATOMIC - END で呼び出しで使用できるなら可能かもしれませんが、ちょっと無理そうだったので。。。 そろそろタイムリミットなので、Javaでシステムカタログを検索してから、ALTER文を実行というように保守用のプログラムを作ろうと思っています。 もしも、そんなことせずに、テキストのSQLスクリプトだけでできる!という方法をご存じでしたらよろしくお願いします。