Habilitando e desabilitando constraints no Oracle |
Categoria: Oracle | ||||||
Publicado em 10 de Julho de 2013 | ||||||
Existe uma funcionalidade muito interessante no Oracle, que é a possibilidade de desabilitar e habilitar constraints. Isto pode ser útil quando se deseja importar grandes quantidades de dados para obter performance ou cancelar temporariamente verificações de chave-estrangeira, unique ou check. Note que esta funcionalidade, apesar de ser similar com DEFERRABLE e DEFERRED e IMMEDIATE, é diferente pois a última é válida apenas para uma transação (commit), enquanto que ao habilitar e desabilitar constraints, estas permanecem entre transações diferentes. Habilitando e desabilitando constraint Primary Key O seguinte código pode ser utilizado:
A primeira opção utiliza as palavras PRIMARY KEY e a segunda opção opta por desabilitar via nome de constraint. A terceira opção desabilita via MODIFY. No primeiro e no segundo caso, a palavra DISABLE pode ser procedida pelas palavras opcionais VALIDATE ou NOVALIDATE. O padrão é VALIDATE. Para habilitar a PRIMARY KEY, a mesma sintaxe é utilizada, bastando trocar DISABLE por ENABLE. Habilitando e desabilitando constraint Unique A mesma sintaxe da constraint Primary Key pode ser usada (incluindo VALIDATE e NOVALIDATE), apenas substituindo PRIMARY KEY por UNIQUE quando necessário e especificando os campos separados por vírgula entre parênteses:
Habilitando e desabilitando constraints Check e Foreign Key A constraint Check e Foreign Key podem ser habilitadas e desabilitadas somente via nome, seguindo a mesma sintaxe da constraint Primary Key (incluindo VALIDATE e NOVALIDATE). Problemas com ENABLE e DISABLE Como visto acima, para habilitar uma constraint, deve-se utilizar a palavra ENABLE. Contudo, se os dados contidos na tabela não mais suportarem a constraint, ela não será habilitada. Uma opção é utilizar a opção NOVALIDATE. Ela cancelará as verificações das constraints para os dados já armazenados, passando a fazer verificações apenas para novos dados. A mesma técnica pode ser utilizada com DISABLE. Por padrão, antes de desabilitar uma constraint, o Oracle realiza uma verificação nos dados já existentes. Porém, se NOVALIDATE for utilizado, esta verificação não será realizada. O uso de NOVALIDATE é recomendado apenas para evitar aborrecimentos durante a fase de desenvolvimento, sendo que deve ser evitado o uso em ambientes de produção, mantendo-se assim a integridade dos dados. Um outro problema pode surgir quando deseja-se desabilitar uma constraint do tipo Primary Key se uma outra tabela tiver uma chave-estrangeira para este campo. O Oracle não deixará a constraint ser desabilitada. Neste caso, a palavra CASCADE pode ser utilizada para desabilitar também as chaves-estrangeiras das outras tabelas:
A opção CASCADE pode ser utilizada somente com DISABLE, sendo que ao utilizar o ENABLE futuramente, todas as constraints envolvidas deverão ser habilitadas manualmente. |