Oracle
 sql >> Database >  >> RDS >> Oracle

Perché questa Oracle DROP COLUMN altera il valore predefinito di un'altra colonna?

Questo è un bug di Oracle.

Viene attivato aggiungendo una colonna con entrambi NOT NULL vincolo e un DEFAULT valore a una tabella esistente.

Per aggiungere rapidamente la colonna, Oracle 11g memorizza il valore predefinito nel dizionario dei dati. Oracle chiama questo "ottimizzazione dell'aggiunta di colonne".

Questo è più veloce che scrivere il valore predefinito in ogni riga della tabella. Il motore di query dovrebbe quindi sostituire qualsiasi NULL nella riga della tabella con il valore predefinito dal dizionario dei dati. Purtroppo ci sono diversi bug relativi a questo. La tua sembra essere un'istanza di:

Puoi controllare quali colonne sono state aggiunte in questo modo:

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

Nel nostro caso, siamo stati punti da un bug diverso che ha restituito risultati errati per un SELECT FOR UPDATE .

Impostiamo il parametro _add_col_optim_enabled=FALSE per disattivare questa "ottimizzazione". In alternativa, potresti essere in grado di eseguire l'aggiornamento a una versione Oracle successiva in cui questi bug sono stati risolti.

L'aggiornamento o l'impostazione del parametro precedente non risolverà la tabella esistente, che è danneggiata. Devi ricreare quella tabella.