it-swarm.it

ORA-01502: l'indice o la partizione di tale indice sono in un problema di stato utilizzabile

Ho una tabella nel mio database Oracle, dove

select pkcol, count(*) from myTable group by pkcol having count(*) > 1;

i rendimenti

  PKCOL   COUNT(*)
------- ----------
      1          2
      2          2

Prova di rimuovere le righe duplicate

delete myTable where pkcol = 1;

I rendimenti:

ORA-01502: l'indice 'MYTABLE.PK_MT' o la partizione di tale indice sono utilizzabili.

Sto usando Oracle.DataAccess.Client.OracleBulkCopy per riempire la tabella.

Per quanto ho capito la documentazione da Oracle I vincoli PRIMARY KEY dovevano essere controllati.

Ovviamente non vengono controllati, come ho scoperto eseguendo la stessa bulkcopy due volte in successione che è terminata in duplicati in tutte le righe.

Ora lo sto usando solo dopo aver eliminato tutte le righe e sto usando una tabella con una chiave primaria simile come sorgente. Di conseguenza non mi aspetto problemi.

Ma incorporato nel mio script MS Build, finisco con solo 2 duplicati su 2210 righe.

Immagino che ignorare la chiave primaria in primo luogo sia un chiaro bug. Nessuna Bulkcopy dovrebbe essere autorizzata a ignorare i vincoli della chiave primaria.

Edit:

Nel frattempo ho scoperto che le 2 righe in conflitto erano normalmente inserite da alcuni script prima che venisse chiamata bulkcopy. Il problema si riduce al mio problema noto, che bulkcopy non controlla le chiavi primarie qui.

6
bernd_k

Dal documentazione a cui ti colleghi :

I vincoli UNICI vengono verificati quando gli indici vengono ricostruiti alla fine del carico. L'indice viene lasciato in uno stato dell'indice inutilizzabile se viola un vincolo UNIQUE.

Per come la leggo io, lo stesso vale per PRIMARY KEY vincoli sebbene il testo sia un po 'ambiguo. Potrebbe non piacerti questo comportamento, ma non è "un bug" in quanto si comporta come progettato - e ci sono altri modi di finire con questo tipo di vincolo "rotto".

Vedi questo post OTN per maggiori informazioni e un approccio che potrebbe funzionare meglio con te usando pl/sql e forall ... save exceptions.

Di fronte a un problema simile.

Se devi solo eliminare l'errore, fai:

SELECT 'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' REBUILD;'
FROM DBA_INDEXES
WHERE STATUS = 'UNUSABLE';

Questo produrrà ALTER INDEX ... REBUILD; istruzioni per tutti gli indici "inutilizzabili". Eseguili, in modo che gli indici possano essere nuovamente "utilizzabili".

(Copiato spudoratamente da: http://www.squaredba.com/ora-01502-index-or-partition-of-such-index-is-in-unusable-state-145.html : -))

8
Frosty Z