2009-12-04 6 views
1

J'ai trois tables dans ma base de données: Events, Jobs et CollectableEntities. Events a un FK nullable pointant vers la PK des Jobs. Les événements et les travaux ont tous deux des clés FK non nulles (qui sont également les PK de la table) pointant vers PK de CollectableEntities. Ces relations FK sont mises en cascade lors de la mise à jour et de la suppression. Fondamentalement, lorsque vous supprimez un CollectableEntity, je veux que l'événement et/ou le travail associé soit également supprimé.Erreur de cascade de base de données

Je suis maintenant essayer de changer les événements relation d'emploi FK pour définir nulle sur la mise à jour ou supprimer, mais je reçois l'erreur suivante:

Error SQL01268: .Net SqlClient Data Provider: Msg 1785, Level 16, State 0, Line 1 Introducing FOREIGN KEY constraint 'FK_Events_Jobs' on table 'Events' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

Où se trouve le cycle? Comment puis-je éviter ce problème étant donné que la description ci-dessus est le seul que je veux. (Je suis prêt à faire des changements pour éviter d'autres effets secondaires imprévisibles.)

+0

Pouvez-vous poster la table complète créer des scripts, y compris les FK? –

+0

Désolé, c'est une question pour le travail et je ne peux pas poster le schéma propriétaire réel sans obtenir l'approbation. –

Répondre

2

Voir la http://allyourdatabase.blogspot.com/2006/11/multiple-cascade-paths-error-in-sql.html

Vous avez une situation très similaire ... la suppression de collection va tenter une suppression d'événements, qui va tenter une suppression d'emplois en raison de la FK des événements à l'emploi. Mais la suppression de collectables va également tenter de supprimer des emplois en raison de la FK de collectables à des emplois. Avoir deux emplois dans le chemin de cascade est un problème.

Je pourrais être un peu hors sur les détails puisque vous n'avez pas inclus votre schéma, mais le directeur général devrait être correct.

2

Il serait probablement beaucoup plus facile de tout marquer comme "supprimé" au lieu de supprimer réellement les données de la base de données. Donc, sur vos tables, vous auriez un champ appelé Deleted qui est par défaut à false. Ensuite, chaque fois qu'un élément est supprimé, l'enregistrement est marqué comme supprimé. Après cela, vous venez de mettre en place une instruction where dans vos requêtes pour supprimer les éléments supprimés et vous avez terminé.

+0

Pas ce que je cherche, mais ça pourrait marcher. –

+0

également avec cette méthodologie, vous ne courez pas le risque de ruiner votre intégrité référentielle ou la perte de données. – DForck42

+0

Dans mon cas, je stocke plus de 10 000 enregistrements par heure, donc pour des considérations d'espace, j'ai vraiment besoin de purger les anciens. Pour les personnes qui ne se soucient pas de la taille de leur base de données, cela pourrait fonctionner tant que la colonne Supprimé est indexée. –

Questions connexes