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:

1
2
3
4
5
6
7
8
9
10
11
ALTER TABLE TABELA_CLIENTES
DISABLE PRIMARY KEY
;
 
ALTER TABLE TABELA_CLIENTES
DISABLE CONSTRAINT PK_COD_CLIENTE
;
 
ALTER TABLE TABELA_CLIENTES
MODIFY PRIMARY KEY DISABLE
;

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:

1
2
3
4
5
6
7
8
9
10
11
ALTER TABLE TABELA_CLIENTES
DISABLE UNIQUE(CPF)
;
 
ALTER TABLE TABELA_CLIENTES
DISABLE CONSTRAINT UN_CPF
;
 
ALTER TABLE TABELA_CLIENTES
MODIFY UNIQUE(CPF) DISABLE
;

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:

1
2
3
ALTER TABLE TABELA_CLIENTES
DISABLE PRIMARY KEY CASCADE
;

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.

 

Copyright © Fernando Hidemi Uchiyama 2010 - Todos os direitos reservados