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éthodePré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.

1
--  utlexcpt.sql
2
create table exceptions(row_id rowid,
3
	                owner varchar2(30),
4
	                table_name varchar2(30),
5
		        constraint varchar2(30));

SyntaxeDésactivation de contraintes

1
ALTER TABLE nom_table DISABLE CONSTRAINT nom_contrainte;

RemarqueDé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.

SyntaxeRéactivation des contraintes

1
ALTER TABLE nom_table ENABLE CONSTRAINT nom_contrainte
2
3
	EXCEPTIONS INTO exceptions ;

MéthodeErreurs 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.

1
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émentDé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é.