Requetes de désactivation et de réactivations des contraintes forein key d'une base de données

Description

Sous SQL Server (7, 2000, 2005), dans certains cas il peut être utile d'empêcher le moteur de vérifier si les contraintes d'intégrités sont respectées. Ex : Insertion en masse d'enregistrements dans la base de données.
pour cela, plutot que de supprimer les contraintes, j'ai réalisé ce bout de script pour les désactiver. Apres l'insertion en masse des enregistrements, un script de réactivation des contraintes permet, comme son nom l'indique de les réactiver mais aussi de vérifier que le contenu de la base est conforme aux FK

Source / Exemple :


-- Script de désactivation des contraintes FK d'une base de données

-- Déclaration de la variable qui va contenir les requetes à exécuter
Declare @Requete VarChar(1000)
-- Déclaration du curseur qui va contenir pour chaque FK, une requete de désactivation
Declare Cur_Contrainte Cursor For
	select 'ALTER TABLE ' + t.name + ' NOCHECK CONSTRAINT ' + fk.name 
	from sysobjects fk, sysobjects t
	where fk.type='F' and fk.parent_obj=t.id
	order by t.name
Open Cur_Contrainte

-- Boucle sur le curseur et exécution des requetes
Print 'Désactivation des contraintes en cours, Patience ....'
Fetch Next From Cur_Contrainte Into @Requete
While @@Fetch_Status = 0
Begin
	-- Possibiliter d'afficher les requetes exécutées en supprimant le commentaire ci dessous
	-- Print @Requete
	Execute (@Requete)
	Fetch Next From Cur_Contrainte Into @Requete
End
-- Fermeture du curseur et libération des ressources
Close Cur_Contrainte
Deallocate Cur_Contrainte
Print 'Désactivation des contraintes terminée !'

-- Script de réactivation des contraintes FK d'une base de données

-- Déclaration de la variable qui va contenir les requetes à exécuter
Declare @Requete VarChar(1000)
-- Déclaration du curseur qui va contenir pour chaque FK, une requete de réactivation
-- Précision : l'option WITH CHECK CHECK permet de forcer le moteur à activer la contrainte 
--	       mais aussi à vérifier que le contenu des tables est conforme aux contraintes
--	       sinon il est possible de ne mettre que l'option "CHECK" mais dans ce cas, la contrainte
--	       est activée sans controle de l'existant
Declare Cur_Contrainte Cursor For
	select 'ALTER TABLE ' + t.name + ' WITH CHECK CHECK CONSTRAINT ' + fk.name 
	from sysobjects fk, sysobjects t
	where fk.type='F' and fk.parent_obj=t.id
	order by t.name

Open Cur_Contrainte

-- Boucle sur le curseur et exécution des requetes
Print 'Réactivation des contraintes en cours, Patience ....'

Fetch Next From Cur_Contrainte Into @Requete
While @@Fetch_Status = 0
Begin
	-- Possibiliter d'afficher les requetes exécutées en supprimant le commentaire ci dessous
	-- Print @Requete
	Execute (@Requete)
	Fetch Next From Cur_Contrainte Into @Requete
End
-- Fermeture du curseur et libération des ressources
Close Cur_Contrainte
Deallocate Cur_Contrainte
Print 'Réactivation des contraintes terminée !'

Conclusion :


J'attends vos commentaires positifs et / ou négatifs...

Pat

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.