Bonsoir,
aujourd'hui, j'ai eu envie de mettre à l'épreuve mon SGBD : lui serait-il possible de gérer la mise à jour/suppression en cascade dans le cadre d'une relation réflexive ? Je m'explique :
Soit la table test constituée de 2 champs, pk et fk :
Je souhaite établir une relation entre le champ fk (clef étrangère) et le champ pk (clef primaire) afin que la suppression/mise à jour d'un enregistrement entraîne la suppression/mise à jour des enregistrements enfants.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 pk fk ----- 1 1 2 1 3 2
En l'occurrence, la suppression de l'enregistrement 1/1 entraînerait donc celle de l'enregistrement 2/1... qui entraînerait elle-même celle de l'enregistrement 3/2.
Le but n'est pas de gérer cela avec un trigger, mais de savoir si le SGBD est en mesure de le gérer dans le cadre d'une simple relation avec cascade.
J'ai donc tenté d'exécuter l'instruction de création de table suivante sous SQL Server 2000 :
Et SQL Server 2000 de me répondre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE TABLE test ( pk NUMERIC, fk NUMERIC, CONSTRAINT c1 PRIMARY KEY (pk), CONSTRAINT c2 FOREIGN KEY (fk) REFERENCES test (pk) ON UPDATE CASCADE ON DELETE CASCADE);
La réponse n'est pas celle que j'espérais, mais elle a le mérite d'être claire.L'introduction d'une contrainte de clé étrangère 'c2' dans la table 'TEST' peut provoquer des cycles ou des accès en cascade multiples. Spécifiez ON DELETE NO ACTION ou ON UPDATE NO ACTION ou modifiez les autres contraintes de clés étrangères
Me demandant si un autre SGBD serait en mesure de gérer ce type de relation, j'ai essayé de la mettre en place sous Access. Access me laisse bien mettre en place la relation, mais lorsque j'essaie de supprimer un enregistrement parent, j'essuie le refus suivant :
Faut-il en déduire qu'il est impossible à un SGBD de gérer nativement (sans trigger) une mise à jour/suppression en cascade dans le cadre d'une relation réflexive ?Impossible de mettre à jour; actuellement verrouillé(e).
Remarques :
- mes recherches m'ont amené à découvrir que ce thème avait déjà été abordé, sans réponse définitive, dans la discussion suivante :
http://www.developpez.net/forums/sho...d.php?t=166443
- une KB de Microsoft décrit le message d'erreur SQL Server que j'ai cité plus haut. A noter que la KB s'attarde plus sur la question des "accès en cascade multiples" que sur celle des "cycles", sujet de la présente discussion.
- mes recherches m'ont également conduit vers un topic soulevant la question du bien fondé de la mise a jour/suppression en cascade. Il est bien évident que la discussion créée aujourd'hui n'a pas pour objet de débattre du bien fondé de cette technique mais de savoir si, oui ou non, une mise à jour/suppression en cascade est techniquement possible dans le cadre d'une relation réflexive.
Partager