いくつかの制約があるiSeries(IBM-i / AS400)にテーブルがあります。このようなテーブルはSQLで作成されており、他のテーブルからこのテーブルにリンクしているいくつかの外部キーがあります(実際のSQLはここでは少しわかりにくいです)。
CREATE TABLE ABCLIB.ABCDE (
DEIDN INTEGER NOT NULL WITH DEFAULT,
DETTL VARGRAPHIC (50) ALLOCATE(25),
DETYP CHAR (1) NOT NULL WITH DEFAULT);
ALTER TABLE ABCLIB.ABCDE ADD PRIMARY KEY (DEIDN);
ALTER TABLE ABCLIB.ABCFG ADD FOREIGN KEY (FGDEK)
REFERENCES ABCLIB.ABCDE (DEIDN)
ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE ABCLIB.ABCHI ADD FOREIGN KEY (HIDEK)
REFERENCES ABCLIB.ABCDE (DEIDN)
ON DELETE RESTRICT ON UPDATE RESTRICT;
さて、ずっと後で、フィールドを追加するためにそのテーブルを変更する必要があります。
ALTER TABLE ABCLIB.ABCDE ADD COLUMN DEICN VARGRAPHIC (100) ALLOCATE(50)
このメッセージは次のようになります。
Row or object ABCDE in ABCLIB type *FILE in use.
確認しましたが、現時点ではこのテーブルにオブジェクトロックはありません。ジョブログを確認すると、次のように表示されます。
Constraint cannot be removed from file Q_AT000000.
Constraint(s) not removed from file Q_AT000000.
File ABCDE in ABCLIB not changed.
Row or object ABCDE in ABCLIB type *FILE in use.
もちろん、問題の制約を削除して再度追加することもできますが、これは必要ないはずだと思います。追加する列は、制約とは何の関係もありません。これはおそらく、OS400(i5 / OS)が実際には既存のテーブルを変更しておらず、代わりに新しいテーブルを作成してデータをコピーしているという事実の結果であると思います。
しかし、キーを一時停止し、変更後に再開する方法はありますか?
(SQLでこれを行う必要がない、またはそもそもテーブルを別の方法で作成することを提案する回答は、ここでは適用できないため、役に立ちません...)