it-swarm.it

Impossibile eliminare il vincolo inesistente e neanche crearlo

Durante il test di alcuni script di migrazione con una copia dei dati di produzione (gli script funzionano bene con i dati di sviluppo) ho trovato una situazione curiosa. Un VINCITORE è cambiato, quindi sto inviando i comandi DROP + ADD:

ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;

ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
    CONTROL_ID,
    CALLE_AYTO_DUPL
)
ENABLE;

Il comando DROP ha funzionato bene ma quello ADD non è riuscito. Ora sono in un circolo vizioso. Non riesco a eliminare il vincolo perché non esiste (il rilascio iniziale ha funzionato come previsto):

ORA-02443: Impossibile eliminare il vincolo - vincolo inesistente

E non posso crearlo perché il nome esiste già:

ORA-00955: il nome è già utilizzato da un oggetto esistente

Io digito A_DUP_CALLE_UK1 nella casella Cerca Ricerca di SQL Developer e ... eccolo! Proprietario, nome tabella, tablescape ... tutto corrisponde: non è un oggetto diverso con lo stesso nome, ma è il mio vincolo originale. La tabella viene visualizzata nei dettagli del vincolo ma il vincolo non viene visualizzato nei dettagli della tabella.

Le mie domande:

  • Qual è la spiegazione per questo?
  • Come posso assicurarmi che non accada quando eseguo il vero aggiornamento nel server live?

(Il server è 10g XE, non ho abbastanza reputazione per creare il tag.)

16

Suppongo che Marian abbia ragione e questo è causato da un indice e un vincolo univoci con lo stesso nome, ad esempio:

create table t( k1 integer, k2 integer, 
                constraint u1 unique(k1,k2) using index(create unique index u1 on t(k1,k2)),
                constraint u2 unique(k2,k1) using index u1);

select count(*) from user_indexes where index_name='U1';

COUNT(*)               
---------------------- 
1  

alter table t drop constraint u1;

select count(*) from user_indexes where index_name='U1';

COUNT(*)               
---------------------- 
1  

Normalmente quando si aggiunge un vincolo univoco, viene creato un indice univoco con lo stesso nome, ma l'indice e il vincolo non sono la stessa cosa. Dai un'occhiata a all_indexes per vedere se esiste un indice chiamato A_DUP_CALLE_UK1 e prova a capire se viene utilizzato da qualcos'altro prima di rilasciarlo!

Sembra molto strano.

Puoi eseguire:

 SELECT *
 FROM user_objects
 WHERE object_name = 'A_DUP_CALLE_UK1'

per verificare se il tipo di oggetto di cui si lamenta Oracle. Quindi è possibile eseguire l'appropriata istruzione DROP per questo.

L'unica altra cosa che mi viene in mente è di eliminare completamente la tabella usando DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTS per sbarazzarsi di tutto ciò che appartiene a quella tabella e quindi ricrearlo completamente.

Se la tabella contiene dati valutabili, è possibile effettuare un backup prima di:

CREATE TABLE old_data
AS
SELECT *
FROM A_DUP_CALLE;

Dopo aver ricreato il tavolo, puoi farlo

INSERT INTO A_DUP_CALLE (col1, col2, col3) 
SELECT col1, col2, col3
FROM old_data

per ripristinare i dati.

Ho avuto lo stesso problema solo pochi minuti fa ... e ho trovato una spiegazione.

Creando una chiave primaria, Oracle crea due oggetti: un vincolo e un indice che controlla la parte "UNIQUE".

Eliminando il vincolo, l'indice rimane lì, usando lo stesso nome dell'indice, quindi se si esegue solo

alter table t drop constraint u1;

Abbandonerai solo il vincolo. Per eliminare l'indice, è necessario eseguire

drop index u1;

Questo dovrebbe fare il lavoro. In alternativa, è possibile eseguire entrambi questi comandi contemporaneamente con il comando

alter table t drop constraint u1 including indexes;
5

Il vincolo chiave primaria viene fornito con l'indice. Rilasci il vincolo ma non l'indice. Dai un'occhiata:

select * from ALL_OBJECTS where OBJECT_NAME = 'PK_TBL_CONSTR';

e vedi OBJECT_TYPE è INDEX.

Quindi fai entrambe le cose:

alter table TBL drop constraint PK_TBL_CONSTR;
drop index PK_TBL_CONSTR;
1
gavenkoa

Fai questo

ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT "A_DUP_CALLE_UK1";

Funzionerà.

IMAGE: enter image description here

1
Sachin