Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Cascade sur Supprimer ou utiliser des déclencheurs ?

SUPPRIMER EN CASCADE dans MSSQL Server ne peut cascader que sur une seule table. Si vous avez deux tables avec des relations de clé étrangère avec une table de dimension, vous ne pouvez supprimer en cascade que l'une d'entre elles. (Cela permet d'éviter que les suppressions ne se répercutent en cascade sur plusieurs chemins et ne créent des conflits, tout comme C++ autorise l'héritage multiple, mais C# n'autorise qu'un seul héritage)

Lorsque c'est le cas, vous êtes obligé d'utiliser des déclencheurs ou de gérer spécifiquement le cas dans votre code.

Pour cette raison, j'ai vu de nombreuses personnes opter pour l'utilisation de déclencheurs dans tous les cas. Même lorsqu'il n'y a qu'une seule table étrangère. Cela garantit la cohérence et permet aux utilisateurs de savoir quoi rechercher lors de la maintenance de la base de données.

Si l'on pouvait cascader une suppression à plus d'une table, je dirais que ce serait l'option la plus préférable. Cette limitation, cependant, brouille les pistes et je suis actuellement plus en faveur de déclencheurs possédant tous ces comportements. La surcharge liée à l'utilisation de déclencheurs pour les suppressions et les mises à jour en cascade n'est que mineure en termes de codage, mais permet des pratiques standard véritablement génériques.

MODIF :

Vous voudrez peut-être déplacer la "réponse acceptée" vers quelqu'un d'autre, j'ai compris que j'avais tort sur ce qui précède.

Vous POUVEZ avoir plusieurs tables de faits avec des contraintes de clé étrangère ON DELETE CASCADE vers une seule table de dimension.

Ce que vous ne pouvez pas faire, c'est qu'une table de faits ait des contraintes de clé étrangère ON DELETE CASCADE vers plusieurs tables de dimension.

Ainsi, par exemple...
- Table de dimension [Person] (id INT IDENTITY, )
- Table de dimension [Exam] (id INT IDENTITY, )
- Table de visage [Exam_Score] (person_id INT, exam_id INT, note INT)

Si la personne ou l'examen sont supprimés, vous souhaitez que le ou les enregistrements Exam_Score associés soient également supprimés.

Ce n'est pas possible en utilisant ON DELETE CASCADE dans MS SQL Server, d'où la nécessité de déclencheurs.

(Mes excuses à Mehrdad qui a essayé de m'expliquer mais j'ai complètement raté son propos.)