Come modificare una tabella a iSeries che ha vincoli? Ottenere “FILE * in uso.” Errore

StackOverflow https://stackoverflow.com/questions/3588615

  •  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 ...)

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top