
Envoyé par
Lyche
C'est un before... En gros, il faut que ton trigger nettoie la table fille avant que le delete de la table mère ne s'exécute...
Le problème est que MS SQL Server ne propose pas BEFORE. On peut en passer par INSTEAD OF, comme on l’a vu ça marche, mais quel serait le bénéfice pour karimot d’utiliser un trigger ? Comme je l’ai déjà dit, le résultat obtenu est le même qu’avec une action référentielle CASCADE, mais en bien plus lourd du point de vue du codage, moins bon quant aux performances et ça n’est pas forcément portable (vers d’autres SGBD).

Envoyé par
Lyche
Ho, simple question de pouvoir garder la main sur ses mouvement de BDD...
Dans l’exemple proposé par karimot, que voulez-vous garder comme main ? Le choix de karimot est que soient supprimés automatiquement les employés rattachés à un département qui fait l’objet d’une suppression, ni plus, ni moins. Mais ce choix de karimot peut être remis en question d’un point de vue fonctionnel et, dans l’intérêt des employés, on peut préférer promouvoir la règle suivante :
« On ne peut pas supprimer un département auquel est rattaché au moins un employé ».
Auquel cas c’est l’action référentielle ON DELETE NO ACTION qui sera pertinente et dans ces conditions, pour arriver à supprimer un département, il faudra par exemple d’abord affecter les employés concernés à d’autres départements.

Envoyé par
Lyche
Je déteste les cascades je trouve ça anti-relationnel.
Détester l'action référentielle CASCADE est votre droit le plus strict (confidence pour confidence, moi ce sont les poireaux...), mais vous êtes alors en opposition totale avec les théoriciens du Modèle Relationnel de Données. Je vous renvoie à l’ouvrage de référence de C.J. Date An Introduction to Database Systems (8th Edition) au chapitre 9 (« Integrity »). La théorie relationnelle ne fait des prescriptions que pour les fondements du Modèle Relationnel de Données, et parce qu’une contrainte référentielle n’est qu’un cas particulier de contrainte de base de données, la théorie ne la prescrit pas formellement (donc a fortiori l’action référentielle CASCADE), mais elle y est évidemment favorable et fait des recommandations en ce sens.
Par exemple, dans Database Explorations, Essays on The Third Manifesto and Related Topics, au chapitre 13, page 227 :
A relational database language like Tutorial D should allow <
foreign key def>s of the following form to be specified as part of a base or virtual definition:
1 2 3 4 5
| <foreign key def>
::= FOREIGN KEY {[all but] <attribute ref commalist>}
REFERENCES <relation exp>
[ON DELETE [NO] CASCADE]
[ON UPDATE [NO] CASCADE] |
Par ailleurs, au moins d’un point de vue sémantique, il n’est pas interdit d’utiliser un concept valide quand il répond à ce qu’on cherche. Pour illustrer : EMPLOYE est une entité-type forte, qui ne fait que désigner l’entité-type DEPARTEMENT ; un employé n’est pas la propriété du département auquel il est rattaché à l’instant T (il peut en changer), en vertu de quoi, pour la contrainte référentielle connectant les tables DEPARTEMENT et EMPLOYE, coder NO ACTION est justifié contrairement à CASCADE. En revanche, si vous avez une entité-type COMMANDE pour les commandes et une entité-type LIGNE_COMMANDE pour les lignes de commande, cette dernière est sémantiquement une entité-type faible (weak entity-type), une propriété de COMMANDE, c’est « à la vie à la mort », la suppression d’une commande entraîne celle de ses lignes (on a une relation de composition au sens UML), et au niveau SQL on n’aurait que des mauvaises raisons pour coder NO ACTION plutôt que CASCADE pour la contrainte référentielle connectant les tables COMMANDE et LIGNE_COMMANDE.

Envoyé par
Lyche
Sans blagues, on créer des systèmes pour s'assurer qu'il n'y aura pas de suppressions de données sans contrôle (fk) et derrière on créer des cascades qui font justement sauter les contraintes...
Pardon ? CASCADE garantit l’intégrité référentielle, heureusement !
Supposons qu’on ait un enchaînement de contraintes référentielles pour les tables T1, T2, T3, ..., Tm-1, Tm (T2 fait référence à T1, T3 à T2, etc.) :
T1 <- T2 <- T3 <- ... Tm-1 <- Tm
Et que l’action référentielle soit systématiquement CASCADE, sauf pour la contrainte connectant Tm à Tm-1.
Un DELETE portant sur un tuple de T1 déclenche un stimulus propagé en cascade jusqu’à Tm. Si aucun tuple de Tm n’est touché, la suppression est effective pour toutes les autres tables de la chaîne. Par contre, si au moins un tuple de Tm est touché, il y a une réaction négative et la tentative de suppression est rejetée en bloc, aucune table n’est mise à jour (l’opération est atomique, c’est tout ou rien) et en contrepartie, comme pour karimot, on a droit à un message d’erreur justifiant le rejet de l’opération.
Ça fonctionne ainsi en relationnel, et dès 1969, Ted Codd (père du Modèle Relationnel de Données) l’avait à l’esprit :
« Some deletions may be triggered by others, if deletion dependencies between specified relations are declared... » (E.F. Codd « Derivability, Redundancy, and Consistency of Relations Stored in Large Data Banks », IBM Research Report RJ599, August 19th, 1969).
Incidemment, j’aimerais savoir ce que vous entendez par faire « sauter les contraintes »...

Envoyé par
darkelend
Je préfère autant une procédure stockée qui va dans la même transaction supprimer toutes les informations dans le bon ordre.
Ou l’art de se compliquer la vie. Un SGBD relationnel comme MS SQL Server fait les choses dans le bon ordre et de façon parfaitement transparente, sinon ça se saurait. Par ailleurs, au vu de votre approche, n’oubliez pas que le jour où vous aurez à faire évoluer vos structures de bases de données, vous aurez à vérifier qu’aucun « bon ordre » n’aura été oublié et ne sera donc pris en défaut...

Envoyé par
darkelend
De plus, si quelqu'un tente un delete manuel, les règles d'intégrité lèveront une alerte qui disparait avec le mode cascade.
Qu’appelez vous un « delete manuel » ? Quoi qu’il en soit, je répète : l’action référentielle CASCADE garantit évidemment l’intégrité référentielle. Et pour ma part, ça fait 25 ans que je l’observe (avec DB2, l’intégrité référentielle a été mise à notre disposition en 1988, et bien entendu, nombre de ceux qui la réclamaient à cor et à cris l’on aussitôt rejetée, au nom de la performance, en toute méconnaissance de cause, sans même avoir bâti de prototypes de performances)...
Partager