11
votes

Se déplacer des erreurs de clé étrangère cycliques lors de la tentative de générer des scripts d'insertion de données dans SQL 2008

J'essaie de générer des scripts d'insertion à l'aide de l'Assistant SQL Server 2008 Script. Lors de la génération des scripts, j'obtiens l'erreur suivante:

"La base de données sélectionnée contient des clés étrangères créant un cycle. Les données de publication uniquement ne sont pas prises en charge pour les bases de données avec des relations clés étrangères cycliques."

J'ai tenté de désactiver et de supprimer toutes les contraintes de la base de données. L'erreur est toujours en cours. Y a-t-il un moyen de contourner cela? Éventuellement faire ignorer SQL les contraintes tout en générant les scripts.


2 commentaires

Puisque vous ne devriez pas avoir de conception qui a des contraintes clés étrangères cycliques, je vous suggère d'abord de réparer votre mauvais design. Même si vous pouvez désactiver les contraintes pour l'insert, c'est une très mauvaise idée car vous obtiendrez des problèmes d'ingéniosité des données. Votre conception est incorrecte, corrigez-la.


En plus de ce que HLGEM a déclaré, si vous ne pouvez pas insérer des données à l'aide d'un script directement dans la base de données, comment dans le diable l'interface graphique sera-t-elle capable de le faire?


7 Réponses :


0
votes

Tout d'abord, la réponse de IMHO HLGEM est un peu cavalier - il existe des raisons valables de manière à avoir des références cycliques.

Cela dit, je pense que le générateur de script est hyper sensible. Il semble penser à n'importe quelle paire PK / FK est "cyclique" et j'ai fini par avoir à utiliser une copie de ma base de données à partir de laquelle j'avais dépouillé toutes les clés pour obtenir l'exportation pour aller au-delà de l'erreur "cyclique". Un script comme ce qui suit peut vous aider à supprimer les clés mondiales, mais bien sûr, soyez prudent!

Sélectionner 'Alter Table' + Object_Name (parent_obj) + 'Drop contrainte' + [Nom] Comme script de SysObjects où xtype in ('f')

[Je n'ai pas écrit ceci. Voir http://www.sqlteam.com/forums/topic.asp?topic_id=46682]

En outre, l'outil est assez inutile en termes de rétroaction car son rapport ne fournit pas assez de détails pour affiner lorsque les références cycliques supposées existent.

Enfin, j'ai trouvé que l'outil était assez flaky dans lequel je reçois des délais d'attente aléatoires. Une autre observation que je n'ai pas étudié de manière approfondie est, je pense que l'outil peut vous obliger à démarrer à partir de zéro après l'erreur cyclique pour effacer son cache depuis que je vois un comportement différent lorsque j'utilise le bouton précédent contre la nouvelle fois.


0 commentaires

0
votes

Vous pouvez exporter les données en définissant l'option Script - "Contraintes de vérification du script" à FALSE

Désolé, cela ne fonctionnera pas: (

Vous devrez déterminer quelle table provoque le problème.


0 commentaires

18
votes

sur la page de l'assistant où vous choisissez le bouton radio pour sélectionner tous les objets de base de données ou des objets spécifiques, assurez-vous de sélectionner tous les objets de base de données. Pour une raison quelconque, l'outil a besoin de quelque chose de là pour générer même si vous voulez juste que le script de l'insertion de table.

Une fois que j'ai changé ce bouton radio sur tous les objets de base de données et sélectionné l'option avancée pour générer le type de script = données uniquement, cela fonctionnait complètement.


2 commentaires

Faire une démonstration de données sur un serveur local avant une conférence et que l'interface avait changé et soudainement, cela ne fonctionnait pas (je suppose que j'ai mis à jour les SSMS ou quelque chose) ... cela a travaillé et sauvé mes fesses, merci!


Et si je veux exécuter les instructions d'insertion dans une autre base de données, dois-je exécuter SQL pour d'autres objets aussi ??



2
votes

J'avais le même problème et j'ai découvert aujourd'hui que vous pouvez utiliser SQL Server Management Studio 2012 contre un DB R2 2008 et vous n'obtiendrez pas l'erreur:

SQL Server Données de script: Solution de contournement pour cycliqueforignkeyException?


0 commentaires

2
votes

Économiser sur Fichier contre une nouvelle fenêtre d'éditeur de requête semble faire fonctionner pour moi sur Gestion Studio 2008: \


1 commentaires

Certainement un bug dans les SSMS. Au-delà de votre solution, si vous touchez le bouton de retour et donnez un nouvel essai de générer sur une nouvelle fenêtre de requête (simplement changer le bouton radio), il génère!



0
votes

J'avais la même erreur car je n'ai pas eu de table sélectionnée dans la liste d'objets (une grande table que je voulais créer dans un autre script). La sélection de toutes les tables a résolu le problème.

PD: Peut-être un peu de retard, mais la recherche de CyclicalForignKeyException est d'abord dans Google.


0 commentaires

13
votes

J'ai eu le même problème que l'OP. Ensuite, j'ai essayé à nouveau cette fois dans les options avancées, pour l'option "Types de données à script", j'ai sélectionné "Schéma et données" plutôt que des données uniquement. Puis cela a fonctionné pour moi sans se plaindre de clés cycliques.


2 commentaires

C'est une bonne solution pour 1 table, fonctionne pour moi avec "schéma et données" plutôt que des données uniquement. Ensuite, il s'agit simplement d'un cas d'édition du script de sortie pour laisser les inserts (et n'importe quel ensemble identité_insert ON / OFF avant et après). Beaucoup plus facile que de scripter tout le dB! Merci


Cela a fonctionné pour mon pour plusieurs tables, même lorsque les touches étrangères de script étaient désactivées, etc. Merci