Oracle
 sql >> Base de données >  >> RDS >> Oracle

Pourquoi cet Oracle DROP COLUMN modifie-t-il la valeur par défaut d'une autre colonne ?

Il s'agit d'un bogue Oracle.

Il est déclenché en ajoutant une colonne avec à la fois un NOT NULL contrainte et un DEFAULT valeur à une table existante.

Pour ajouter la colonne rapidement, Oracle 11g stocke la valeur par défaut dans le dictionnaire de données. Oracle appelle cela "ajouter une optimisation de colonne".

C'est plus rapide que d'écrire la valeur par défaut dans chaque ligne du tableau. Le moteur de requête est alors censé remplacer tout NULL dans la ligne du tableau par la valeur par défaut du dictionnaire de données. Malheureusement, il y a plusieurs bugs liés à cela. Le vôtre semble être une instance de :

Vous pouvez vérifier quelles colonnes ont été ajoutées comme ceci :

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

Dans notre cas, nous avons été piqués par un bogue différent qui a renvoyé des résultats incorrects pour un SELECT FOR UPDATE .

Nous définissons le paramètre _add_col_optim_enabled=FALSE pour désactiver cette "optimisation". Alternativement, vous pourrez peut-être effectuer une mise à niveau vers une version ultérieure d'Oracle où ces bogues sont résolus.

La mise à niveau ou la définition du paramètre ci-dessus ne résoudra pas votre table existante, qui est corrompue. Vous devez recréer cette table.