Come modificare una tabella a iSeries che ha vincoli? Ottenere “FILE * in uso.” Errore
-
01-10-2019 - |
Domanda
Ho una tabella su un iSeries (IBM-i / AS400), che ha alcuni vincoli. La tabella viene creata con SQL in questo modo, con una manciata di chiavi esterne che collegano da altre tabelle a questa tabella (SQL effettivo è stato un po 'offuscato qui):
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;
Ora, molto più tardi, ho bisogno di modificare tale tabella per aggiungere un campo:
ALTER TABLE ABCLIB.ABCDE ADD COLUMN DEICN VARGRAPHIC (100) ALLOCATE(50)
che si traduce in questo messaggio:
Row or object ABCDE in ABCLIB type *FILE in use.
Ho controllato e ci sono sicuramente serrature di oggetti di questo tavolo in questo momento. Quando controllo il joblog, vedo questo:
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.
Ora, ho potuto ovviamente rimuovere e aggiungere nuovamente i vincoli in questione, ma mi sento come questo non dovrebbe essere necessario. La colonna sto aggiungendo non ha nulla a che fare con i vincoli. Credo che questo probabilmente è il risultato del fatto che in realtà OS400 (i5 / OS) non sta alterando in realtà il tavolo esistente, ma invece sta creando una nuova tabella e la copia dei dati, e che è probabilmente dove il dolore entra.
Ma c'è un modo per eventualmente sospendere le chiavi e poi riprendere dopo l'alter?
(Le risposte che non coinvolgono fare questo con SQL o suggerire la creazione della tabella in modo diverso, in primo luogo, non sono utili in quanto non sono applicabili qui ...)
Soluzione
La risposta è: ho perso il fatto che c'era un blocco su uno dei tavoli che aveva una chiave esterna che punta a quel tavolo. O, per dirla senza mezzi termini:! Io sono un idiota ??p>
Altri suggerimenti