Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum ändert diese Oracle DROP COLUMN den Standardwert einer anderen Spalte?

Dies ist ein Oracle-Fehler.

Es wird ausgelöst, indem eine Spalte mit einem NOT NULL hinzugefügt wird Constraint und ein DEFAULT Wert in eine vorhandene Tabelle.

Um die Spalte schnell hinzuzufügen, speichert Oracle 11g den Standardwert im Datenwörterbuch. Oracle nennt dies "Spaltenoptimierung hinzufügen".

Das geht schneller, als den Standardwert in jede Tabellenzeile zu schreiben. Die Abfrage-Engine soll dann jede NULL in der Tabellenzeile durch den Standardwert aus dem Data Dictionary ersetzen. Leider gibt es diesbezüglich mehrere Bugs. Ihre scheint eine Instanz zu sein von:

So können Sie überprüfen, welche Spalten hinzugefügt wurden:

 select owner, object_name, name 
 from dba_objects, col$
 where bitand(col$.PROPERTY,1073741824)=1073741824
 and object_id=obj#;

In unserem Fall wurden wir von einem anderen Fehler gestochen, der die falschen Ergebnisse für ein SELECT FOR UPDATE zurückgab .

Wir setzen den Parameter _add_col_optim_enabled=FALSE um diese "Optimierung" auszuschalten. Alternativ können Sie möglicherweise auf eine neuere Oracle-Version aktualisieren, in der diese Fehler behoben sind.

Durch Aktualisieren oder Festlegen des obigen Parameters wird Ihre vorhandene Tabelle nicht repariert, da sie beschädigt ist. Sie müssen diese Tabelle neu erstellen.