Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que este Oracle DROP COLUMN altera o valor padrão de outra coluna?


Este é um bug do Oracle.

Ele é acionado adicionando uma coluna com um NOT NULL restrição e um DEFAULT valor para uma tabela existente.

Para adicionar a coluna rapidamente, o Oracle 11g armazena o valor padrão no dicionário de dados. A Oracle chama isso de "adicionar otimização de coluna".

Isso é mais rápido do que escrever o valor padrão em cada linha da tabela. O mecanismo de consulta deve substituir qualquer NULL na linha da tabela pelo valor padrão do dicionário de dados. Infelizmente, existem vários bugs relacionados a isso. O seu parece ser uma instância de:

Você pode verificar quais colunas foram adicionadas assim:
 select owner, object_name, name 
 from dba_objects, col$
 where bitand(col$.PROPERTY,1073741824)=1073741824
 and object_id=obj#;

No nosso caso, fomos picados por um bug diferente que retornou os resultados incorretos para um SELECT FOR UPDATE .

Definimos o parâmetro _add_col_optim_enabled=FALSE para desligar esta "otimização". Como alternativa, você pode atualizar para uma versão posterior do Oracle em que esses bugs sejam resolvidos.

Atualizar ou definir o parâmetro acima não corrigirá sua tabela existente, que está corrompida. Você deve recriar essa tabela.