sql >> Database >  >> RDS >> Oracle

Waarom wijzigt deze Oracle DROP COLUMN de standaardwaarde van een andere kolom?

Dit is een Oracle-bug.

Het wordt geactiveerd door een kolom toe te voegen met zowel een NOT NULL beperking en een DEFAULT waarde toe aan een bestaande tabel.

Om de kolom snel toe te voegen, slaat Oracle 11g de standaardwaarde op in de datadictionary. Oracle noemt dit "kolomoptimalisatie toevoegen".

Dit is sneller dan het wegschrijven van de standaardwaarde in elke tabelrij. De query-engine moet dan elke NULL in de tabelrij vervangen door de standaardwaarde uit de datadictionary. Helaas zijn er verschillende bugs die hiermee te maken hebben. De jouwe lijkt een instantie te zijn van:

U kunt als volgt controleren welke kolommen zijn toegevoegd:

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

In ons geval werden we gestoken door een andere bug die de verkeerde resultaten opleverde voor een SELECT FOR UPDATE .

We stellen parameter _add_col_optim_enabled=FALSE in om deze "optimalisatie" uit te schakelen. Als alternatief kunt u mogelijk upgraden naar een latere Oracle-versie waarin deze bugs zijn opgelost.

Het upgraden of instellen van de bovenstaande parameter zal uw bestaande tabel, die corrupt is, niet herstellen. Je moet die tabel opnieuw maken.




  1. Hoe log ik in en authenticeer ik bij Postgresql na een nieuwe installatie?

  2. Waarom werkt GRANT niet in MySQL?

  3. django.db.migrations.RenameModel en AutoField-reeksnaam

  4. MySQL relationele databases gebruiken op Fedora 14