IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Une histoire d'intégrité référentielle


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Points : 29
    Points
    29
    Par défaut Une histoire d'intégrité référentielle
    us,
    Je ne suis pas un vrai développeur mais plus un passionné d'informatique.
    J'ai installé une bdd sur SQL Server en 2014.
    Cette base a été crée après une migration depuis une bdd access 2010.
    Les tables et liaisons ont été exportées sans aucun problème.

    Dans les tables, il y 2 tables liées par intégrité référentielle:
    - une table patient.
    - une table ambulance.
    De ce fait, plusieurs patients peuvent être transportés par la même compagnie d'ambulance.

    Les ambulances ont une clé primaire contruite sur la base Pays//Ville//Numéro de téléphone.
    Lorsque je modifie cette clé primaire (imaginons que la compagnie d'ambulance change de numéro de téléphone!), les modifications se répercutent dans la table "Patient"....donc pas de problème!
    Si je supprime cette ambulance (code VBA du style DoCmd.RunSQL + DELETE), non seulement elle disparait, mais elle fait également disparaitre les patients qui ont été transportés par cette même compagnie d'ambulance....:-(

    Première question: Pour ne plus avoir cette suppression en cascade, dois-je aller dans SQL Management Studio et appliquer ces règles DELETE RULES : No Action, MODIFY RULES : Cascade ?

    Deuxième chose:
    Dans cette BDD, j'ai une 3ie table "Booking" qui sert juste à encoder les fois où l'on fait appel à ces ambulances avec des estimatifs de prix.
    Cette table n'est pas liée avec la table ambulance!
    On y encode la date, le trajet, et j'y a mis une combobox pour y faire apparaitre les identifiants de l'ambulance de la table "ambulance".
    Je le redis encore une fois, les tables "ambulances" et "Booking" ne sont pas liées!

    Eh bien lorsque je supprime une compagnie d'ambulance par le code VBA du style DoCmd.RunSQL + DELETE, tous les enregistrements dans la table "Booking" liés à la compagnie d'ambulance, disparaissent également!!!

    Je ne comprends absolument pas pourquoi....!!!!

    C'est pour cela que je fais appel à votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Les ambulances ont une clé primaire contruite sur la base Pays//Ville//Numéro de téléphone.
    Lorsque je modifie cette clé primaire (imaginons que la compagnie d'ambulance change de numéro de téléphone!), les modifications se répercutent dans la table "Patient"....donc pas de problème!
    Pourtant vous dites ensuite :

    Si je supprime cette ambulance (code VBA du style DoCmd.RunSQL + DELETE), non seulement elle disparait, mais elle fait également disparaitre les patients qui ont été transportés par cette même compagnie d'ambulance....:-(
    Or une valeur de clé primaire identifie de façon immuable une relation. Comme vous venez de la constater, le numéro de téléphone peut changer, mais aussi et pourquoi pas la ville et le pays.
    Alternativement, on aurait pu choisir le numéro de châssis de l'ambulance, mais je ne suis pas sûr que s'il faille que le véhicule change de pays, ce soit toujours le cas. Il s'agit là d'une clé naturelle / alternative, mais elle ne me semble pas être idéale. C'est donc là tout l'intérêt des clés primaires subrogées, une pratique courante étant de laisser le moteur générer les valeurs automatiquement.
    Partant de là, on peut attacher une ville (une ville n'ayant dans votre cas probablement qu'un seul pays, mais attention il y a quelques exceptions), et un numéro de téléphone, chacun avec des dates de validité.
    Il semble donc que le modèle de données soit à revoir

    Première question: Pour ne plus avoir cette suppression en cascade, dois-je aller dans SQL Management Studio et appliquer ces règles DELETE RULES : No Action, MODIFY RULES : Cascade ?
    Il semble que cela convient au cas d'utilisation que vous décrivez, mais il faut considérer tous ceux possibles.

    Eh bien lorsque je supprime une compagnie d'ambulance par le code VBA du style DoCmd.RunSQL + DELETE, tous les enregistrements dans la table "Booking" liés à la compagnie d'ambulance, disparaissent également!!!
    Je ne comprends absolument pas pourquoi....!!!!
    Y a-t-il un trigger sur la table des ambulances ?

    @++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par helico57570 Voir le message
    Première question: Pour ne plus avoir cette suppression en cascade, dois-je aller dans SQL Management Studio et appliquer ces règles DELETE RULES : No Action, MODIFY RULES : Cascade ?
    Oui...

    ...

    Eh bien lorsque je supprime une compagnie d'ambulance par le code VBA du style DoCmd.RunSQL + DELETE, tous les enregistrements dans la table "Booking" liés à la compagnie d'ambulance, disparaissent également!!!

    Je ne comprends absolument pas pourquoi....!!!!
    Je pense que vous avez une intégrité référentielle que vous ne voyez pas.....

    Pour en avoir le coeur net, clic droit sur la table et demandez le script CREATE TABLE.... Vous verrez sans doute apparaître une ligne du genre ALTER TABLE ... FOREIGN KEY....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/01/2013, 14h51
  2. Réponses: 8
    Dernier message: 22/03/2012, 09h50
  3. Réponses: 0
    Dernier message: 30/12/2011, 15h00
  4. Réponses: 8
    Dernier message: 27/10/2010, 13h21
  5. Réponses: 2
    Dernier message: 07/08/2007, 09h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo