Sommaire
- Les restrictions de l'intégrité référentielle jouent contre nous
- Option d'intégrité référentielle : Mettre à jour en cascade les champs correspondants
- Effacement impossible d'enregistrements dans une table source
- Option d'intégrité référentielle : Effacer en cascade les enregistrements correspondants
- Mis en garde de la puissance des options des relations
J'ai pensé à un cas de figure : admettons que dans T_Pays, j'aie un pays qui est mal orthographié, que va-t-il se passer ?
Nous allons essayer : Ouvrez T_Pays, et remplacez Suisse par Suice.
Ah oui, ça marche ! Bien sûr, puisqu'il n'y a aucun client qui vient de Suisse !
Bonne réponse ! Nous allons essayer de changer l'orthographe d'un pays dont un ou plusieurs clients est originaire. Par exemple : Josiane Balasco vient de France. Restez dans T_Pays, et remplacez France par Frense, et Enregistrez.
Là j'ai un message d'erreur :
. C'est bien ce que je disais : Il y a un problème !
D'accord... Eh bien, vous n'avez qu'à aller dans T_Client, chercher Josiane Balasco, et remplacer son France par Frense, et puis voilà !Les restrictions de l'intégrité référentielle jouent contre nous
Mais je ne peux pas, puisqu'il y a une relation avec intégrité référentielle ! On a vu ça lors de la précédente leçon, ce n'est pas possible !
Vous avez raison. Ceci dit, ça tombe bien qu'on ne puisse pas changer l'orthographe de France, puisque c'est la bonne orthographe. C'est quand même ce qu'on voulait, non ?Oui, mais si ce n'était pas la bonne orthographe quand même ? Je suis OBLIGE de laisser France toute ma vie, même si en fait la vraie orthographe était par exemple "République française" ? C'est nul !
Qu'est-ce qui nous ennuie ? Les relations ? Eh bien vous n'avez qu'à les supprimer ! Cherchez tous les clients qui viennent de France, les remplacer par "République Française" à la main (Ou utiliser Edition/Remplacer), et, à la fin, remplacer France par République Française dans la table T_Pays ! Ainsi, les 2 tables correspondront à nouveau, et vous pourrez réinstaller la relation avec intégrité référentielle ! Vous suivez ?Hein ?? Mais c'est totalement malpratique... Et si j'ai douze mille clients à changer ??? Je passe ma journée à faire ça ! C'est n'importe quoi !
Allez, je vous donne l'astuce de la mort-qui-tue : Nous allons utiliser notre "Suice". Un peu plus haut dans la leçon, vous avez changé "Suisse" en "Suice". Vous n'avez pas eu de problème puisqu'aucun client ne provenait de Suisse - Ni de Suice d'ailleurs.Allez dans T_Client, et définissez (par exemple) 3 clients comme provenant de Suice :

Maintenant, essayez de rectifier l'orthographe de Suice en Suisse pour, par exemple Juliette Griko.
Donc, d'accord, ici, je ne peux pas, à cause de l'intégrité référentielle. Ca j'ai bien compris !
Oui. Maintenant, quittez T_Client, allez dans T_Pays, et changez Suice en Suisse. Vous pouvez ?Option d'intégrité référentielle : Mettre à jour en cascade les champs correspondants
Non plus ! C'est comme on disait plus haut : C'est le serpent qui se mord la queue. Alors, l'astuce, c'est quoi ?
L'astuce consiste à quitter la table T_Pays, et aller dans Outils/Relations. Cliquez 2 fois sur la relation qui lie Pays de T_Pays à PaysOrigine de T_Client. Cochez "Mettre à jour en cascade les champs correspondants" :
Ah d'accord ! C'est cette option qui va me permettre de changer Suice en Suisse dans T_Pays sans qu'Access me dise qu'il y a un problème d'intégrité référentielle !
Exactement. Lorsque vous irez dans T_Pays, et que vous changerez Suice en Suisse, Access, discrètement, changera tous les "Suice" de T_Client en "Suisse" (En l'occurrence : Juliette Griko, Jean-Paul Belmondos et Jules Martin).Nous allons essayer : allez donc dans T_Pays, et Changez Suice en Suisse. Quittez T_Pays, et retournez dans T_Client : Regardez les 3 clients sont devenus "Suisse" :

D'accord. Mais ça ne marche pas dans le sens inverse je suppose : Si par exemple je dis que Juliette Griko est "Confédération Helvétique" par exemple, ça ne change pas "Suisse" en "Confédération Helvétique" dans T_Pays ?
Effectivement, ça ne marche pas dans ce sens là. C'est seulement dans la table du côté 1 que ça marche :
Effacement impossible d'enregistrements dans une table source
Et si jamais je voulais supprimer "Suisse" de la table T_Pays, ça dirait que Juliette Griko, Jean-Paul Belmondos et Jules Martin n'ont plus de pays ?
Non. Pas du tout ! En fait ce ne serait pas possible. Il y aurait à nouveau l'intégrité référentielle qui nous empêcherait de le faire. Essayez. Effacez "Suisse" de T_Pays. Vous obtenez le message d'erreur suivant :
Donc c'est impossible de supprimer "Suisse". Bon dans un sens, ce n'est pas plus mal, parce que je ne vois pas pourquoi je supprimerais la Suisse si j'ai des clients qui sont Suisses !
Absolument ! D'ailleurs, si vraiment vous voulez supprimer la Suisse, vous n'avez qu'à supprimer tous les clients qui viennent de Suisse, et alors, Access vous laissera supprimer Suisse de T_Pays puisqu'il n'y a alors plus de clients correspondants.Oui. Mais on peut quand même imaginer le cas de figure ou j'aimerais supprimer la Suisse dans T_Pays, et que j'aimerais qu'il supprime tous les clients Suisses automatiquement ?
Option d'intégrité référentielle : Effacer en cascade les enregistrements correspondants
Oui, on peut. Par exemple, imaginons que vous commercialisez des médicaments, et que soudain, une nouvelle loi (suisse justement) interdit complètement la vente par correspondance de médicaments... Du coup, vous pouvez rayer de votre table clients tous vos clients suisses. Voici la marche à suivre :- Allez dans les relations
- Cliquez 2 fois sur la relation T_Client.PaysOrigine <--> T_Pays.Pays
- Cochez la case "Effacer en cascade les enregistrements correspondants"
- Cliquez sur OK
- Quittez les relations
Actuellement, vous avez vos 3 clients suisses : - Allez dans T_Pays
- Supprimez "Suisse" (Je vous rappelle encore une fois qu'il NE FAUT PAS sélectionner en noir Suisse et faire Delete, mais qu'il faut bien cliquer dans la marge de gauche et appuyer sur la touche DEL de votre clavier - SUPPR si vous avez un clavier français)
- Vous avez ce message qui n'est pas un message d'erreur, mais un message d'attention :
Qui veut dire que vous allez supprimer la Suisse de T_Pays, mais également les quatorze millions de clients suisses de T_Client. Bon, j'exagère avec quatorze millions, il n'y en aque 3. Mais il y en aurait 14'000'000, le message aurait été strictement le même. Access ne nous informe pas du nombre d'enregistrements sur le point d'être véritablement effacés ! - Répondez OUI
- Quittez T_Pays
- Allez dans T_Client

Et bien entendu, les IDClient qui sont des numéros automatiques ne se suivent plus, mais ça vous vous en doutiez. (revoyez la leçon sur les NuméroAuto (13) si vous avez besoin de vous rafraîchir la mémoire)
Mis en garde de la puissance des options des relations
En fait, c'est une option aussi pratique que dangereuse finalement...
Oui. Il faut avoir la tête bien sur les épaules, et déterminer les implications de vos choix ! C'est à vous de voir comment vous désirez qu'Acecss réagisse lorsque vous supprimez un enregistrement dont un champ est lié à une autre table : Voulez-vous simplement un message d'erreur qui vous informe que ce n'est pas possible, ou alors un simple message d'attention comme nous venons de le voir ? Vous constaterez avec l'expérience que ça dépend des cas.
Bon... Hem... On peut résumer ?
Il faut observer chaque relation avec soin, et définir chaque option de relation en toute connaissance de cause. Il faut imaginer la base de données une fois terminée, et se poser la question à chaque fois : Est-il judicieux d'établir une relation, faut-il lui appliquer une intégrité référentielle, et est-il nécessaire, recommandé, ou interdit de "Mettre à jour en cascade les champs correspondants" et/ou "Effacer en cascade les enregistrements correspondants". Notez qu'il n'est pas possible de demander des options pour une relation qui n'a pas d'intégrité référentielle. |
Avez-vous bien compris ?
|
Exercice
Nous allons faire un exercice amusant qui va bien illustrer ce concept de modification et de suppression des données en cascade. Nous allons lier 3 tables l'une à l'autre. Vous allez constater 2 fautes d'orthographe : Belgike et Europpe. Les voici (Créez une base de données Intercontinental.MDB dans laquelle vous créez ces 3 tables) avec les tables suivantes : T_Client
Par contre, il NE DOIT PAS être possible d'effacer un pays dont au moins un client est d'origine (Ici, il s'agit de Belgique, France, Chine et Japon). Une fois tout ce travail terminé, quels sont les continents que vous pouvez effacer ? Réponse : (Sélectionnez la ligne pour visualiser la réponse juste ici : Afrique, Amérique, Océanie) Téléchargez la solution de l'exercice ici (Pour tester la solution, il suffit de changer Belgike en Belgique dans la table T_Pays, et Europpe en Europe dans la table T_Continent, pour constater que c'est possible et que les modifications sont répercutées dans les tables correspondantes. Et vous ne pouvez pas effacer Belgique ni France ni Chine ni Japon dans T_:Pays, car des clients correspondent) |
0 commentaires:
Enregistrer un commentaire