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

Soyez le premier à donner votre avis sur cette source.

Vue 12 513 fois - Téléchargée 299 fois

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

Ajouter un commentaire

Commentaires

soupi
Messages postés
1
Date d'inscription
lundi 4 décembre 2006
Statut
Membre
Dernière intervention
25 juin 2008
-
Je suis d'accord, Ce script est bien utile et quand on en a besoin on a rarement le temps de l'écrire.
FENETRES
Messages postés
196
Date d'inscription
jeudi 15 juillet 2004
Statut
Membre
Dernière intervention
14 avril 2009
-
Je trouve cette source très utile et je suis assez surpris par le faible nombre de connections !
pneau
Messages postés
258
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
27 octobre 2010
3 -
salut
oups, effectivement, c'est une précision oubliée...
cela fonctionne avec les versions SQL Server suivante :
SQL 7, SQL 2000, SQL 2005
cordialement
Pat
RDave
Messages postés
30
Date d'inscription
vendredi 9 avril 2004
Statut
Membre
Dernière intervention
19 novembre 2007
-
salut,
ca fonctionne avec quel sgbd ? MySQL 5 par exemple ?

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.