sql >> Databasteknik >  >> RDS >> Oracle

Varför ändrar denna Oracle DROP COLUMN standardvärdet för en annan kolumn?

Det här är en Oracle-bugg.

Den utlöses genom att lägga till en kolumn med både NOT NULL begränsning och en DEFAULT värde till en befintlig tabell.

För att snabbt lägga till kolumnen lagrar Oracle 11g standardvärdet i dataordboken. Oracle kallar detta "lägg till kolumnoptimering".

Detta är snabbare än att skriva ut standardvärdet i varje tabellrad. Frågemotorn är sedan tänkt att ersätta valfri NULL i tabellraden med standardvärdet från dataordlistan. Tyvärr finns det flera buggar relaterade till detta. Ditt verkar vara en instans av:

Du kan kontrollera vilka kolumner som har lagts till så här:

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

I vårt fall drabbades vi av en annan bugg som returnerade felaktiga resultat för en SELECT FOR UPDATE .

Vi ställer in parametern _add_col_optim_enabled=FALSE för att stänga av denna "optimering". Alternativt kan du kanske uppgradera till en senare Oracle-version där dessa buggar är lösta.

Att uppgradera eller ställa in ovanstående parameter kommer inte att fixa din befintliga tabell, som är korrupt. Du måste återskapa den tabellen.




  1. Hur kan jag lösa ORA-00911:fel med ogiltiga tecken?

  2. SQL-returrad om inget resultat hittades

  3. Entity Framework 6 GUID som primärnyckel:Kan inte infoga värdet NULL i kolumnen "Id", tabellen "FileStore"-kolumnen tillåter inte nollvärden

  4. Kan jag använda EXCEPTIONS i en FOR LOOP för att tvinga fram fortsättning vid fel?