2008-11-17 6 views
1

J'ai deux tables. Club et Coach. Entre eux est 0,1 - 0,1 relation (l'entraîneur peut avoir zéro ou un club, le club peut avoir zéro ou un entraîneur). Quand je veux changer l'entraîneur du club donné, je dois mettre à jour la table du club. Donc je dois changer idCoach de ce club. Considérons un nouvel entraîneur (l'entraîneur nouvellement désigné du club donné) est déjà entraîneur d'un autre club. Je dois régler sur le champ Null idCoach de ce club, car son entraîneur sera assigné à un autre club. Aussi, si le club pour lequel je veux changer d'entraîneur, a déjà un entraîneur, alors je dois mettre idClub de cet entraîneur (dans la table Coach) à Null.Arrêt de mise à jour MS SQL Trigger appel verrou mort?

Tout ce qui précède, s'applique également lorsque je veux changer le club de l'entraîneur. (Doit être défini sur le champ Null idCoach du club précédent d'un entraîneur donné et doit être défini sur null idCoach du nouveau club). Les mêmes problèmes peuvent survenir lorsque j'insère un nouvel enregistrement dans la table Club ou Coach, ou si je supprime l'existant (en insertion, mise à jour et suppression, je dois faire attention aux références correspondantes et les dissocier).

Je veux résoudre ce problème avec des déclencheurs. Je suppose que je devrais avoir 3 déclencheurs dans la table de club (pour insérer, mettre à jour et supprimer) et 3 plus dans la table d'entraîneur. Dans le déclencheur de mise à jour (par exemple dans Club) je dois mettre à jour la table Coach qui déclenchera à nouveau la mise à jour dans le Club (parce que le corps doit mettre à jour la table Club) et déclenchera Coach et déclenchera et ainsi de suite. Donc, je vais avoir un verrou mort.

Comment résoudre ce problème?

Ceci est la première fois que je travaille avec des déclencheurs, désolé à l'avance, pour cette grande explication d'une chose simple.

À la votre!

Répondre

2

Je suggère que cela pourrait ne pas être une utilisation appropriée pour les déclencheurs, qui sont très difficiles à déboguer, et souvent surprendre les gens par la façon dont ils ne prennent pas en charge les opérations unique dossier que vous attendez. Décomposer en instructions SQL simples et envelopper une transaction autour d'elle.

+0

C'est pourquoi les nouveaux développeurs ne devraient pas être autorisés à créer des déclencheurs. Je trouve bizarre que les gens supposent que ça ne marche que d'un seul disque à la fois, mais ensuite je suis un spécialiste de la base de données et je pense dans les décors. Je n'ai jamais pensé qu'ils ne travailleraient pas dans des décors. – HLGEM

+0

J'ai un processus de débogage de déclencheur qui le rend relativement facile si vous êtes intéressé. Trop long pour un commentaire mais je peux ajouter à la fin de cette question si vous voulez le voir. – HLGEM

0

Je recommande d'éviter les déclenchements si vous le pouvez. Si vous devez essayer d'utiliser Au lieu de déclencheurs au lieu de déclencheurs normaux. La différence est de déclencher le déclenchement avant que toute donnée soit réellement modifiée. Cela dit, je pense que votre bien mieux à l'aide des procédures stockées et cherchent à voir si vous

Une autre suggestion est si vous pouvez modéliser cette place comme une entité associative. Je suppose que l'entraîneur du club doit également être l'entraîneur du club. Donc, ce que vous pouvez faire est de créer une table CoachAssignment, maintenant vous n'avez plus qu'à conserver cet enregistrement. Si vous avez besoin d'un entraîneur pour appartenir à plusieurs clubs, le modèle est là pour vous. Cela dit, vous pouvez utiliser la syntaxe If Update (FieldName) pour mettre à jour uniquement les tables dont vous avez réellement besoin. Si vous avez besoin d'arrêter un déclencheur récursive, vous pouvez éviter cela en TRIGGER_NESTLEVEL()

2

Est-il acceptable d'avoir une 3ème table, qui peut contenir des relations? Je pense que ce sera une approche simple de travailler avec.

Il suffit de supprimer l'enregistrement de la nouvelle table, si l'entraîneur démissionne d'un club. Insérer un enregistrement, pour un entraîneur rejoignant un nouveau club.

Espérons que cela aide.

0

Je suis d'accord avec shahkalpesh - votre design devrait inclure une table Coach, une table Club, une troisième table (ClubCoach?) Pour stocker les relations. Ensuite, tout ce que vous auriez à faire est d'appliquer la règle où un entraîneur ne peut pas être assigné à plus d'un club (et vice versa) à l'extérieur. Vous pouvez également avoir des tables d'entraîneur et de club avec idClub dans le tableau des entraîneurs (en appliquant la règle d'un club par entraîneur) et appliquer la règle «Un entraîneur par club» à l'extérieur.

Questions connexes