Leçon 17 : Options des relations

Temps nécessaire pour suivre cette leçon : Une petite demie heure

Pour suivre cette leçon, vous devez avoir suivi les leçons précédentes. Ou plus précisément, vous devez être en possession de la base de données ProFormation.mdb telle qu'elle était à la fin de la leçon précédente. Si vous n'êtes pas certain de l'avoir, vous pouvez la télécharger ici

Aperçu de cette leçon

Dans cette leçon, nous allons étudier les options complémentaires qu'offrent les relations. Nous allons pouvoir changer ou supprimer les pays dans la table T_Pays, et les voir instantanément se mettre à jour dans la table T_Client.

Sommaire

  1. Les restrictions de l'intégrité référentielle jouent contre nous
  2. Option d'intégrité référentielle : Mettre à jour en cascade les champs correspondants
  3. Effacement impossible d'enregistrements dans une table source
  4. Option d'intégrité référentielle : Effacer en cascade les enregistrements correspondants
  5. 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. . Enregistrez (SHIFT ENTER si vous aviez oublié). Et voilà. Ca marche !

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" :. Cliquez sur OK, et quittez les relations.

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 : . C'est logique quand on y réfléchit...


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 :

  1. Allez dans les relations
  2. Cliquez 2 fois sur la relation T_Client.PaysOrigine <--> T_Pays.Pays
  3. Cochez la case "Effacer en cascade les enregistrements correspondants"
  4. Cliquez sur OK
  5. Quittez les relations
    Actuellement, vous avez vos 3 clients suisses :
  6. Allez dans T_Pays
  7. 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)
  8. 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 !
  9. Répondez OUI
  10. Quittez T_Pays
  11. Allez dans T_Client

Oh surprise ! Il y a 3 clients en moins : Les 3 suisses (Sans jeu de mots...) :

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 ?

  1. J'ai une table T_Couleur, qui contient un seul champ : "Couleur", avec les données suivantes :
    Rouge
    Vert
    D'autre part, j'ai une table T_Ami avec 2 champs : Prenom et Couleur. Les données sont :
    Robert/Vert
    André/Vert
    Louis/Bleu
    Noémie/Vert
    Je définis une relation avec intégrité référentielle entre Couleur de T_Ami et Couleur de T_Couleur, avec comme option "Effacer en cascade les enregistrements correspondants". Dans la table T_Couleur, j'efface Vert. Combien me reste-t-il de clients ?

    a. 1***
    b. 2
    c. 3
    d. La situation est impossible *** (Il n'y a pas Bleu dans T_Couleur)

  2. J'ai une table T_Couleur, qui contient un seul champ Couleur avec les données
    Rouge
    Vert
    D'autre part, j'ai une table T_Ami avec 2 champs : Prenom et Couleur. Les données sont :
    Robert/Vert
    André/Vert
    Louis/Vert
    Noémie/Vert

    Je définis une relation avec intégrité référentielle entre Couleur de T_Ami et Couleur de T_Couleur, avec comme option "Effacer en cascade les enregistrements correspondants". Dans la table T_Couleur, j'efface Vert. Combien me reste-t-il de clients ?

    a. Plus aucun ***
    b. 1
    c. La situation est impossible
    d. Tous restent et un message d'erreur est généré

  3. J'ai une table T_Couleur, qui contient un seul champ Couleur avec les données
    Rouge
    Vert
    D'autre part, j'ai une table T_Ami avec 2 champs : Prenom et Couleur. Les données sont :
    Robert/Vert
    André/Rouge
    Louis/Vert
    Noémie/Rouge
    Je définis une relation avec intégrité référentielle entre Couleur de T_Ami et Couleur de T_Couleur, avec comme option "Mettre à jour en cascade les champs correspondants". Dans la table T_Couleur, je remplace Rouge par Noir. Que se passe-t-il dans T_Client ?

    a. Rien du tout
    b. André et Noémie ont maintenant Noir comme couleur ***
    c. Tous les clients ont Noir comme couleur
    d. Rien ne change et un message d'erreur est généré

  4. J'ai une table T_Couleur, qui contient un seul champ Couleur avec les données :
    Rouge
    Vert
    D'autre part, j'ai une table T_Ami avec 2 champs : Prenom et Couleur. Les données sont :
    Robert/Vert
    André/Rouge
    Louis/Vert
    Noémie/Rouge
    Je définis une relation sans intégrité référentielle entre Couleur de T_Ami et Couleur de T_Couleur. Dans la table T_Couleur, je remplace Rouge par Noir. Que se passe-t-il dans T_Client ?

    a. Rien du tout ***
    b.André et Noémie ont maintenant Noir comme couleur
    c. Tous les clients ont Noir comme couleur
    d. Rien ne change et un message d'erreur est généré

Pour voir les solutions, il vous suffit de sélectionner le questionnaire ci-dessus : 3 petites étoiles *** apparaîtront en face des bonnes réponses.

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

Prenom Pays
André Belgike
Bernard France
Charles Belgike
Daniel Chine
Eugène Japon

T_Pays

Pays Continent
Belgike Europpe
France Europpe
Suisse Europpe
Chine Asie
Ouganda Afrique
Japon Asie

T_Continent

Continent
Asie
Afrique
Amérique
Europpe
Océanie

Une fois ces 3 tables créées, il s'agit de les relier entre elles...A vous de voir quels champs de quelles tables se lient avec quels champs de quelles autres tables... Une fois qu'elles sont liées (Avec intégrité référentielle évidemment !), il s'agit de donner les options nécessaires pour corriger Belgike et Europpe (Bien évidemment, il doit suffire d'écrire UNE SEULE fois Belgique pour que la correction se fasse automatiquement partout. Même commentaire pour Europpe !)

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)

Si vous n'êtes pas tout à fait certain d'avoir suivi correctement toutes les étapes de cette leçon, vous avez la possibilité de télécharger ici la version de ProFormation.mdb exactement dans l'état ou elle devrait être à la fin de cette leçon.

Avez-vous une question technique concernant cette leçon ? Cliquez ici !
Une remarque sur cette leçon ? Un problème ? Une erreur ? une ambiguité ? Soyez gentil de m'en informer