dポイントプレゼントキャンペーン実施中!

DB2で以下のように明示的な名前のないUNIQUE制約を削除したいのですが、よい方法をご存じの方がおられましたらご教授ください。

(例)
1. 表の作成
CREATE TABLE TEST ( COL1 INT NOT NULL)

2. 明示的な名前を作成せずにUNIQUE制約を作成
ALTER TABLE TEST ADD UNIQUE (COL1);

上記のように名前指定しなかったUNIQUE制約を
ALTER TABLE文で削除したいのですが、どのように
すればよろしいのでしょうか?

マニュアルの構文では制約名を指定する必要あるようで、
syscat.tabconstカタログで自動でつけられた制約名を調べた後、
以下のように指定したところ制約は削除されました。

(例)
ALTER TABLE TEST DROP CONSTRAINT SQL090123084403480

しかしプログラムの修正が少なくなるよう、制約名を調べずにALTER TABLE 一文で削除できないものかと悩んでおります。
もしくはストアドプロシージャでも構いません。

よろしくお願いします。

A 回答 (2件)

OS名、DB2のバージョンは、何でしょうか?



>DB2のストアドプロシージャでは動的にDDL文を組み立てて実行することができないよう

ちょっと信じがたいのですが、「EXECUTE IMMEDIATEの実行不可」と言ってますか?

別にストアドプロシジャじゃなくても、いいのですよ。
システムカタログを検索して、テキストファイルに書き出すのでもいいのです。
書き出すときに、

'ALTER TABLE TEST DROP CONSTRAINT "'
検索で得た制約名
'";'

を文字列で組み立てて、ALTER TABLE文を作ればいいのです。
これを実行すれば、目的は達成できませんか?

この回答への補足

chukenkenkouさん、
回答いただき、ありがとうございます。

環境はDB2/LINUX 8.2.7 です。
前提として、保守用のSQLテキストスクリプト内にSQL文を記述して実行
しているので、制約名を知らべてから動的にSQL文を組み立てて実行、という処理が保守用のSQLテキストスクリプト内で完結できるかどうか調べていました。外部のプログラム言語は使わないというのが前提です。

もし"EXECUTE IMMEDIATE"で動的SQLの実行が、SQLのストアドプロシージャか、BEGIN ATOMIC - END で呼び出しで使用できるなら可能かもしれませんが、ちょっと無理そうだったので。。。

そろそろタイムリミットなので、Javaでシステムカタログを検索してから、ALTER文を実行というように保守用のプログラムを作ろうと思っています。
もしも、そんなことせずに、テキストのSQLスクリプトだけでできる!という方法をご存じでしたらよろしくお願いします。

補足日時:2009/02/01 14:52
    • good
    • 0
この回答へのお礼

JAVAプログラムで制約名を取得してから、ALTER TABLE文を作成して実行する方法で解決しました。
どうもありがとうございました。

お礼日時:2009/02/05 04:01

DB2に限った話ではないですが、一般的な考え方としては、次のどちらかでは?



(1)制約名を明示的に付ける。
(2)制約名を意識したくないなら、システムカタログを検索して名称を得て、ALTER PROGRAM文を文字列で生成し、実行するストアドプロシジャを作る。

この回答への補足

ご指摘のとおり、新規のシステムには制約名を明示的につけているのですが、古いシステムにかなりの数の制約が名前なしで生成されているのです。
DB2のストアドプロシージャでは動的にDDL文を組み立てて実行することができないようなので困っていました。
もし、DB2で動的にDDLを実行できる方法あればご教授いただける助かります。

補足日時:2009/01/28 07:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!