Bonjour,
J'ai attentivement lu diverses contributions sur le sujet (ex. https://www.developpez.net/forums/d529939/bases-donnees) sans y trouver la solution à mon problème.
Sur une application pure-Access (Front-End et Back-End Access), j'ai défini une table t_MaTable, avec une clé primaire ID_MaTable (autoincrémentée) et une clé étrangère Pere_ID qui pointe sur une autre ligne de cette même table. Cela permet de définir une sorte de forêt où la racine de chaque chaque arbre est caractérisée par Pere_ID=Null. Sous Access, il me suffit de définir une relation de Pere_ID vers ID_MaTable avec effacement en cascade pour que, quand je détruis un nœud X, cela détruise tous les nœuds ayant X pour père, puis tous les nœuds ayant un de ces fils comme père, etc, etc. Cela permet de détruire avec un seul DELETE tout un arbre, ou tout une branche d'un arbre, ou une simple feuille.
Maintenant, j'essaie de porter tout ça sous SQL (MicroSoft SQL Server Manager 2016) et ça se corse ! Quand je définis la relation de Pere_ID vers ID_MaTable, le champ "Spécification INSERT et UPDATE / Règle de suppression" reste obstinément grisé - alors qu'il est disponible quand je définis une relation entre deux tables différentes.
Comment obtenir sous SQL ce que j'avais déjà sous Access ?
J'ai bien noté l'idée consistant à externaliser la relation Fils-Père dans une table de jointure ne contenant que deux clés étrangères (une vers le fils, une vers le père) mais ça multiplie les tables et j'ai une demi-douzaine de forêts distinctes à gérer (les analyses, les matériaux, les espaces de stockages, etc.) et ça me fait bondir de six à douze tables ... à moins que je regroupe toutes mes arborescences au sein d'une seule table en ajoutant une colonne "Nature" qui me permettre de retrouver tous les arbres ayant une nature commune (ou que je me serve du premier niveau comme un identifiant de cette fameuse "nature") ... ce qui me ferait redescendre de douze tables moyennes à deux grosses. Bref, je me tâte ...
Il y a d'autres trucs comme ça qui roulent sous Access et qui deviennent velus sous SQL ? Déjà que j'ai renoncé à utiliser les champs multi-valués, pourtant si pratiques à utiliser ...
Cordialement,
Olivier
PS : Je me suis dit que c'était une sécurité contre les boucles (car, après tout, mes Pere_ID pourraient bien pointer n'importe où dans la table, sans nécessairement définir une structure arborescente) mais, en cas de relations croisées entre deux tables, on peut aussi déclencher des DELETE en cascade qui finiraient par tout effacer ou par reboucler sur eux-mêmes, donc l'argument du "c'est plus sûr comme ça !" ne tient pas.
Partager