Je traverse un projet que j'ai pris en charge et sur le côté de la base de données, j'ai remarqué que les programmeurs précédents ont écrit un groupe de déclencheurs pour supprimer des enregistrements d'enfants. Ce n'est que ces enregistrements ont déjà une relation de clé étrangère avec le dossier de parent que je supprime. Les déclencheurs de Supprimer ne sont que des déclarations simples supprimées pour les enregistrements d'enfants. P>
Y a-t-il un avantage à écrire un déclencheur pour supprimer des enregistrements d'enfants, ou puis-je simplement le changer en cascade sur Supprimer et aller bien? P>
IM à l'aide de MSSQL 2008. P>
4 Réponses :
Éloignez-vous des déclencheurs inutiles. p>
aller avec sur Supprimer cascade code> si c'est tout ce que vous devez faire. P>
Ils ne sont pas toujours inutiles. Vous ne pouvez par exemple pas, cascade dlete à plus d'une table étrangère.
Je n'ai pas dit qu'ils sont inutiles. J'ai dit que vous devriez utiliser sur Supprimer cascade code> si cela convient à votre problème (je pense que la situation de l'opération est satisfaite par
cascade code>). BTW, que voulez-vous dire "à plus d'une table étrangère" Je suis sûr que
sur Suppr Cascade CODE> fonctionne également de manière hiérarchique. Cependant, il ne prend pas en charge les références directes et indirectes d'une seule table.
Non, MS SQL Server n'autorise pas la suppression d'une clé primaire ou d'une contrainte unique à cascade à plusieurs table. Essayez de la configurer et vous obtenez un message d'erreur. Cascade Supprimer ne fonctionne que de 1 table de dimensions à une table de fait. Cela ne fonctionne pas dans une table de dimensions pour de nombreuses tables de fait.
Dems: Il prend en charge plusieurs tables faisant référence à une table. Il prend également en charge ces tables à référencer par d'autres tables. Cependant, il ne prend pas en charge les cycles ni multiples chemins en cascade. Par exemple, il prend en charge B -> A, C -> A, D -> C mais il ne prend pas en charge B -> A, C -> A, D -> C, D -> A.
Cela n'a expressément pas fonctionné dans les cas de 2000 et 2005 que j'utilise au jour le jour. Je vais devoir lui donner un autre aller demain quand je suis de retour au travail. Savez-vous si cela est nouveau à 2008 ou je suis juste en train de faire quelque chose lorsque j'essaie de le faire en 2000/2005?
Créer une table A (ID INT Touche principale non nulle identité); Créer une table B (ID INT Touche principale non NULL Identité, AID INT Not NULL Références A (ID) sur Suppr Cascade); Créer une table C (ID INT Touche principale non NULL Identité, BID INT NON REFERENCES NULLES B (ID) sur Supprimer CASCADE) CODE> Fonctionne sur SQL Server 2008 et je suis sûr que le comportement a été similaire, au moins depuis 2000 .
Oui, cela fonctionne. Mais si la table et les tables ont eu une clé étrangère à Tablea.Id, vous ne pouviez pas faire les deux contraintes de clés étrangères sur Suppr Cascade.
Oui, c'est ce que j'ai dit le commentaire précédent. Plusieurs chemins ou cycles sont non pris en charge.
Mais vous avez dit "B-> A, C-> A, D-> C" est pris en charge. Les deux premiers de ceux-ci sont ce que je viens de dire ne peut être pris en charge, ce qui est lorsque des déclencheurs sont nécessaires. En effet "Un chemin de cascade linéaire" fonctionne, mais un "chemin de cascade hiérarchique" ne fonctionne pas.
Oui, c'est soutenu. Par A, B, C, D, je veux dire des tables, pas des colonnes. B CODE> est un chemin complètement indépendant pendant que A, C, D se situe sur le même chemin.
Je suis corrigé et j'ai mis à jour ma réponse en conséquence, excusez-vous d'être une combinaison d'aveugles et d'ignorants ...
J'utiliserais cascade sur Supprimer, mais ce n'est que si vous voulez définitivement supprimer l'enfant si le parent est supprimé. P>
Si vous avez une logique conditionnelle (je ne supprime que l'enfant si supprimé le dimanche) puis utilisez un déclencheur. P>
Je voudrais simplement le changer en cascade sur Supprimer code>, sur un système de développement, puis exécutez mes tests de l'unité et assurez-vous que rien ne casse. P>
Cascade Supprimer Strong> dans le serveur MSSQL ne peut faire que cascade à une seule table. Si vous avez deux tables avec des relations clés étrangères à une table de dimension, vous ne pouvez en cascade que de supprimer à l'une d'elles. (Il s'agit d'empêcher les suppresses de cascade via plusieurs chemins et de créer des conflits, tant que C ++ permet de multiples héritage, mais C # n'autorise que l'héritage unique) P>
Lorsque c'est le cas, vous êtes obligé d'utiliser des déclencheurs ou de gérer spécifiquement le boîtier dans votre code. P>
Pour cette raison, j'ai vu de nombreuses personnes optent pour utiliser des déclencheurs dans tous les cas. Même quand il n'y a qu'une seule table étrangère. Cela garantit une cohérence et les gens savent donc quoi rechercher lors de la maintenance de la base de données. P>
Si on pouvait cascader une suppression de plus d'une table, je dirais que ce serait l'option la plus préférable. Cette limitation, cependant, des boudies les eaux et je suis actuellement plus favorable aux déclencheurs possédant tous ces comportements. Les frais généraux à utiliser des déclencheurs pour les suppressions et les mises à jour en cascade sont uniquement mineurs en termes de codage, mais permettent des pratiques standard qui sont vraiment génériques. P>
Vous voudrez peut-être déplacer la "réponse acceptée" à quelqu'un d'autre, j'ai travaillé, je me suis trompé d'abot ci-dessus. P>
Vous pouvez avoir plusieurs tableaux de faits sur Supprimer CASCADE étranger Key Confient à une table de dimension Signle. P>
Ce que vous ne pouvez pas faire est d'avoir une seule table de fait avoir sur la suppression des contraintes de clé étrangère en cascade à plusieurs tables de dimensions. P>
Alors, par exemple ... Si la personne ou l'examen sont supprimés, vous voudrez que les enregistrements Associated_Score soient également supprimés. P>
Ce n'est pas possible en utilisant la cascade de Supprimer dans MS SQL Server, donc le besoin de déclencheurs. P>
(Toutes mes excuses à Mehrdad qui m'ont essayé de m'expliquer, mais j'ai complètement manqué son point.) P>
- Tableau de dimension [personne] (ID INT identité,)
- Tableau de dimension [Examen] (ID Int Identity,)
- Table de visage [Exam_score] (Person_id Int, Exam_id Int, Score Int) P>
Merci dems, cela ressemble exactement pourquoi ils ont mis les déclencheurs en place
Je suis presque d'accord avec les DEMS ici, sauf que j'utilise Appelle-moi un optimiste, mais je crois A) Mon code survivra à un transfert à une version future de MS SQL Server et b) L'équipe SQL Server sera bientôt un jour de réparer la limitation «One Cascade Path», à laquelle Point Je vais remplacer les déclencheurs avec des actions référentielles en cascade :) P> sur Suppr Cascade CODE> (et
sur la mise à jour de la cascade code> à cette affaire) des actions référentielles dans la mesure du possible et ne recourent que des déclencheurs si nécessaire . J'envisagerais également de révoquer les autorisations des tableaux et de forcer l'utilisation des processus stockés «Helper» pour les suppressions et les mises à jour. P>