Désactivation et réactivation de contraintes
Rappel :
Le chargement dans la base dimensionnelle, si les méthodes de transformation ont été correctement écrites, ne comporte que des données valides. De plus ce chargement va impliquer un nombre très important de données. Il est donc souhaitable de désactiver les contraintes sur le modèle dimensionnel pendant le temps de chargement, afin d'accélérer cette procédure.
Notons que si les contraintes ne sont pas désactivées :
à chaque ajout d'une ligne le moteur de la base va devoir vérifier que cette ligne respecte les contraintes ;
de plus si les données ne sont pas chargées exactement dans le bon ordre, des contraintes de type intégrité référentielle peuvent être temporairement non validées.
Précisons enfin qu'une fois le chargement terminé les contraintes seront réactivées afin de vérifier que les méthodes de transformation ont fait correctement leur travail et que les données respectent effectivement les contraintes du modèle dimensionnel. Si les nouvelles données ne respectent pas les contraintes, ces dernières ne pourront être réactivées tant que les erreurs n'auront pas été corrigées.
Méthode : Préalable à la réactivation
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));
Syntaxe : Désactivation de contraintes
ALTER TABLE nom_table DISABLE CONSTRAINT nom_contrainte;
Remarque : Déclaration des contraintes à la création
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.
Syntaxe : Réactivation des contraintes
ALTER TABLE nom_table ENABLE CONSTRAINT nom_contrainte
EXCEPTIONS INTO exceptions ;
Méthode : Erreurs de réactivation des contraintes
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.
Complément : Désactivation des contraintes et suppression des index
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é.