it-swarm-eu.dev

ORA-01502: Der Index oder die Partition eines solchen Index befindet sich in einem Problem mit dem verwendbaren Zustand

Ich habe eine Tabelle in meiner Oracle-Datenbank, wo

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

ergibt

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

Es wird versucht, die doppelten Zeilen zu entfernen

delete myTable where pkcol = 1;

Ausbeuten:

ORA-01502: Der Index 'MYTABLE.PK_MT' oder die Partition eines solchen Index befindet sich im verwendbaren Zustand.

Ich verwende Oracle.DataAccess.Client.OracleBulkCopy, um die Tabelle zu füllen.

Soweit ich die Dokumentation verstehe von Oracle PRIMARY KEY Einschränkungen mussten überprüft werden.

Offensichtlich werden sie nicht überprüft, wie ich festgestellt habe, indem ich zweimal hintereinander dieselbe Bulkcopy durchgeführt habe, die in allen Zeilen in Duplikaten endete.

Jetzt verwende ich es erst, nachdem alle Zeilen gelöscht wurden, und verwende eine Tabelle mit einem ähnlichen Primärschlüssel als Quelle. Als Ergebnis erwarte ich keine Probleme.

Aber tief in meine MS Build-Skripte eingebettet, habe ich nur 2 Duplikate von 2210 Zeilen.

Ich denke, dass das Ignorieren des Primärschlüssels ein klarer Fehler ist. Keine Massenkopie darf Primärschlüsseleinschränkungen ignorieren.

Bearbeiten:

In der Zwischenzeit stellte ich fest, dass die 2 widersprüchlichen Zeilen normalerweise von einem Skript eingefügt wurden, bevor die Massenkopie aufgerufen wurde. Das Problem reduziert sich auf mein bekanntes Problem, dass die Bulkcopy hier keine Primärschlüssel überprüft.

6
bernd_k

Aus der Dokumentation, auf die Sie verlinken :

EINZIGARTIGE Einschränkungen werden überprüft, wenn die Indizes am Ende des Ladevorgangs neu erstellt werden. Der Index bleibt in einem nicht verwendbaren Indexstatus, wenn er gegen eine EINZIGARTIGE Einschränkung verstößt.

So wie ich es lese, gilt das Gleiche für PRIMARY KEY - Einschränkungen, obwohl der Wortlaut etwas mehrdeutig ist. Sie mögen dieses Verhalten vielleicht nicht, aber es ist kein "Fehler", da es sich wie geplant verhält - und es gibt andere Möglichkeiten , um mit dieser Art von "gebrochener" Einschränkung zu enden.

Siehe dieser OTN-Beitrag für weitere Informationen und einen Ansatz, der mit pl/sql und forall ... save exceptions Für Sie möglicherweise besser funktioniert.

Konfrontiert mit einem ähnlichen Problem.

Wenn Sie den Fehler nur beseitigen müssen, gehen Sie wie folgt vor:

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

Dies gibt ALTER INDEX ... REBUILD; Anweisungen für alle "unbrauchbaren" Indizes. Führen Sie sie aus, damit die Indizes wieder "verwendbar" sind.

(Schamlos kopiert von: http://www.squaredba.com/ora-01502-index-or-partition-of-such-index-is-in-unusable-state-145.html : -))

8
Frosty Z