La désactivation et l'activation des contraintes de clé étrangère sont-elles prises en charge dans SQL Server? Ou est-ce que ma seule option est de supprimerdrop
ensuite les contraintes?create
824
La désactivation et l'activation des contraintes de clé étrangère sont-elles prises en charge dans SQL Server? Ou est-ce que ma seule option est de supprimerdrop
ensuite les contraintes?create
Réponses:
Si vous souhaitez désactiver toutes les contraintes de la base de données, exécutez simplement ce code:
Pour les réactiver, exécutez: (l'impression est facultative bien sûr et il s'agit simplement de lister les tableaux)
Je trouve cela utile lors du remplissage des données d'une base de données à une autre. C'est une bien meilleure approche que de supprimer des contraintes. Comme vous l'avez mentionné, il est utile lors de la suppression de toutes les données dans la base de données et de son repeuplement (par exemple dans un environnement de test).
Si vous supprimez toutes les données, cette solution peut vous être utile.
Parfois, il est également pratique de désactiver tous les déclencheurs, vous pouvez voir la solution complète ici .
la source
"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Doit-il y avoir un seul "CHECK"?http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx
la source
Pour désactiver la contrainte, vous avez
ALTER
la table à l'aide de NOCHECKPour vous permettre d'avoir à utiliser le double CHECK :
Une fois terminé, si vous devez vérifier l'état, utilisez ce script pour répertorier l'état de la contrainte. Sera très utile:
la source
sys.sysforeignkeys
msdn.microsoft.com/en-us/library/ms177604.aspxVotre meilleure option consiste à supprimer et créer des contraintes de clé étrangère.
Je n'ai pas trouvé d'exemples dans ce post qui fonctionneraient pour moi "tels quels", l'un ne fonctionnerait pas si les clés étrangères référençaient différents schémas, l'autre ne fonctionnerait pas si la clé étrangère faisait référence à plusieurs colonnes. Ce script prend en compte à la fois plusieurs schémas et plusieurs colonnes par clé étrangère.
Voici le script qui génère les instructions "ADD CONSTRAINT", pour plusieurs colonnes il les séparera par une virgule ( assurez-vous de sauvegarder cette sortie avant d'exécuter les instructions DROP ):
Voici le script qui génère les instructions "DROP CONSTRAINT":
la source
La norme SQL-92 permet de déclarer une contrainte comme DEFERRABLE afin qu'elle puisse être différée (implicitement ou explicitement) dans le cadre d'une transaction. Malheureusement, SQL Server manque toujours cette fonctionnalité SQL-92.
Pour moi, changer une contrainte en NOCHECK revient à changer la structure de la base de données à la volée - la suppression des contraintes l'est certainement - et quelque chose à éviter (par exemple, les utilisateurs ont besoin de privilèges accrus).
la source
Je suis d'accord avec toi, Hamlin. Lorsque vous transférez des données à l'aide de SSIS ou lorsque vous souhaitez répliquer des données, il semble tout à fait nécessaire de désactiver ou de supprimer temporairement les contraintes de clé étrangère, puis de les réactiver ou de les recréer. Dans ces cas, l'intégrité référentielle n'est pas un problème, car elle est déjà conservée dans la base de données source. Par conséquent, vous pouvez être assuré à ce sujet.
la source
la source
WITH CHECK CHECK
est presque certainement nécessaire!Ce point a été soulevé dans certaines des réponses et des commentaires, mais je pense qu'il est assez important de le rappeler.
Réactiver une contrainte à l'aide de la commande suivante (non
WITH CHECK
) aura de sérieux inconvénients .Remarque: WITH NOCHECK est la valeur par défaut pour la réactivation des contraintes. Je dois me demander pourquoi ...
La vue système sys.foreign_keys offre une certaine visibilité sur le problème. Notez qu'il a à la fois un
is_disabled
et uneis_not_trusted
colonne.is_disabled
indique si les futures opérations de manipulation de données seront validées par rapport à la contrainte.is_not_trusted
indique si toutes les données actuellement dans le tableau ont été validées par rapport à la contrainte.Faut-il faire confiance à vos contraintes? Trouver...
la source
Premier poste :)
Pour l'OP, la solution de kristof fonctionnera, sauf s'il y a des problèmes avec des données massives et des problèmes de ballon de journal des transactions sur les grandes suppressions. De plus, même avec le stockage de tlog à épargner, car les suppressions d'écriture dans le tlog, l'opération peut prendre TRÈS longtemps pour les tables avec des centaines de millions de lignes.
J'utilise une série de curseurs pour tronquer et recharger fréquemment de grandes copies de l'une de nos énormes bases de données de production. La solution conçue tient compte de plusieurs schémas, de plusieurs colonnes de clés étrangères et, mieux encore, peut être lancée pour être utilisée dans SSIS.
Cela implique la création de trois tables intermédiaires (tables réelles) pour héberger les scripts DROP, CREATE et CHECK FK, la création et l'insertion de ces scripts dans les tables, puis la boucle sur les tables et leur exécution. Le script joint se compose de quatre parties: 1.) création et stockage des scripts dans les trois tables intermédiaires (réelles), 2.) exécution des scripts drop FK via un curseur un par un, 3.) Utilisation de sp_MSforeachtable pour tronquer tous les tables de la base de données autres que nos trois tables intermédiaires et 4.) exécution de la création de FK et vérification des scripts FK à la fin de votre package ETL SSIS.
Exécutez la partie de création de script dans une tâche d'exécution SQL dans SSIS. Exécutez la partie "Exécuter Drop FK Scripts" dans une deuxième tâche d'exécution SQL. Placez le script de troncature dans une troisième tâche d'exécution SQL, puis effectuez les autres processus ETL que vous devez faire avant d'attacher les scripts CREATE et CHECK dans une dernière tâche d'exécution SQL (ou deux si vous le souhaitez) à la fin de votre flux de contrôle.
Le stockage des scripts dans de vraies tables s'est avéré inestimable lorsque la réapplication des clés étrangères échoue car vous pouvez sélectionner * à partir de sync_CreateFK, copier / coller dans votre fenêtre de requête, les exécuter un à la fois et résoudre les problèmes de données une fois que vous trouver ceux qui ont échoué / ne parviennent toujours pas à réappliquer.
Ne réexécutez pas le script s'il échoue sans vous assurer que vous réappliquez toutes les clés / vérifications étrangères avant de le faire, ou vous perdrez très probablement une création et vérifier le script fk que nos tables de transfert sont supprimées et recréé avant la création des scripts à exécuter.
la source
Trouver la contrainte
Exécuter le SQL généré par ce SQL
Safeway.
Remarque: Ajout d'une solution pour supprimer la contrainte afin que la table puisse être supprimée ou modifiée sans aucune erreur de contrainte.
la source
Cliquez avec le bouton droit sur la conception de la table et accédez à Relations et choisissez la clé étrangère dans le volet gauche et dans le volet droit, définissez Appliquer la contrainte de clé étrangère sur 'Oui' (pour activer les contraintes de clé étrangère) ou 'Non' (pour désactiver).
la source
La réponse marquée «905» semble bonne mais ne fonctionne pas.
La suite a fonctionné pour moi. Aucune clé primaire, clé unique ou contrainte par défaut NE PEUT être désactivée. En fait, si 'sp_helpconstraint' 'affiche' n / a 'dans status_enabled - Cela signifie qu'il ne peut PAS être activé / désactivé.
- Pour générer un script pour désactiver
- Pour générer un script pour ACTIVER
la source
Vous devriez pouvoir désactiver les contraintes de clé étrangère de la même manière que vous désactivez temporairement les autres contraintes:
Assurez-vous simplement de désactiver la contrainte sur la première table répertoriée dans le nom de la contrainte. Par exemple, si ma contrainte de clé étrangère était FK_LocationsEmployeesLocationIdEmployeeId, je voudrais utiliser ce qui suit:
même si la violation de cette contrainte produira une erreur qui n'indiquera pas nécessairement cette table comme source du conflit.
la source
Un script pour les gouverner tous: il combine les commandes tronquer et supprimer avec sp_MSforeachtable afin que vous puissiez éviter de supprimer et de recréer des contraintes - spécifiez simplement les tables qui doivent être supprimées plutôt que tronquées et pour mes besoins, j'ai inclus un filtre de schéma supplémentaire pour de bon mesure (testé en 2008r2)
la source
Vous pouvez désactiver temporairement les contraintes sur vos tables, travailler, puis les reconstruire.
Voici un moyen facile de le faire ...
Désactivez tous les index, y compris les clés primaires, ce qui désactivera toutes les clés étrangères, puis réactivez uniquement les clés primaires pour pouvoir travailler avec elles ...
[Faites quelque chose, comme charger des données]
Puis réactivez et reconstruisez les index ...
la source
@sql
toujours tronqué. :(J'ai une version plus utile si vous êtes intéressé. J'ai retiré un peu de code d'ici un site Web où le lien n'est plus actif. Je l'ai modifié pour permettre un tableau de tables dans la procédure stockée et il remplit les instructions drop, truncate, add avant de les exécuter toutes. Cela vous donne le contrôle pour décider quelles tables doivent être tronquées.
la source