制約のあるiSeriesのテーブルを変更する方法は? 「*使用中のファイル」を取得します。エラー
-
01-10-2019 - |
質問
いくつかの制約がある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.
私はチェックしました、そして、この時点でこのテーブルには間違いなくオブジェクトロックはありません。 Joblogをチェックすると、これがわかります。
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でこれを行うことを伴わない、またはそもそもテーブルの作成は、ここでは適用されないので役に立たないことを提案する回答...)
解決
答えは、そのテーブルを指し示す外部キーがあるテーブルの1つにロックがあるという事実を見逃しました。または、もっと率直に言ってください:私はばかです!
他のヒント
します 参照制約の有効化または無効化 ヘルプ?
所属していません StackOverflow