Oracle fournit un script (utlexcpt.sql
) pour la création d'une table qui va servir à récupérer les éventuelles erreurs détectées suite à la réactivation des contraintes.
-- utlexcpt.sql
create table exceptions(row_id rowid,
owner varchar2(30),
table_name varchar2(30),
constraint varchar2(30));
ALTER TABLE nom_table DISABLE CONSTRAINT nom_contrainte;
On notera qu'il est important pour pouvoir aisément désactiver les contraintes de les avoir explicitement nommées lors de la création des tables.
ALTER TABLE nom_table ENABLE CONSTRAINT nom_contrainte
EXCEPTIONS INTO exceptions ;
Si les contraintes ne peuvent être réactivées du fait que certaines données ne sont plus conformes, les enregistrements en cause seront référencés (par leur rowid) dans la table exceptions
créée par le script utlexcpt.sql
. Pour retrouver ces enregistrements, exécuter une requête de sélection dans cette table.
SELECT * FROM nom_table WHERE rowid IN (SELECT row_id FROM exceptions);
Une fois les erreurs corrigées, l'opération de réactivation des contraintes peut être renouvelée.
Un contexte qui nécessite la désactivation des contraintes pour améliorer des performances de chargement nécessitera également la suppression des index, également gourmands en ressources lors de la création ou mise à jour des données. Ces index seront recréés une fois le chargement terminé.