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

MS SQL Server Discussion :

Double contrainte de clé étrangère


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Points : 15
    Points
    15
    Par défaut Double contrainte de clé étrangère
    Bonjour,
    Je suis jeune developpeur et j aurai aime avoir l aide de mes ainés pour un probleme bien curieux (enfin pour moi en tout cas lol).
    Voila, je dispose de deux tables (T1 et T2) dont l une possede plusieurs clé etrangere vers l autre...Je crée mes relations correspondantes (Ra et Rb) et decide d ajouter une regle de suppression en cascade pour chacune d entre elle.
    Aucun probleme pour la premiere relation ainsi crée, mais lorsque je fais la meme opération pour la suivante, voila ce qu il m affiche:

    - Impossible de créer la relation 'Rb'.
    L'introduction d'une contrainte FOREIGN KEY 'Rb' sur la table 'T1' peut provoquer des cycles ou des accès en cascade multiples. Spécifiez ON DELETE NO ACTION ou ON UPDATE NO ACTION, ou modifiez d'autres contraintes FOREIGN KEY.
    Impossible de créer la contrainte. Voir les erreurs précédentes.

    Je me demande si cela ne surviendrai pas a cause de l impossibilite pour Sql Server de savoir si les valeurs des cles etrangere sur T1 ne seraient pas identique et qu ainsi il aurait le risque de supprimer deux fois la meme occurence de la table T2?
    Sinon y aurait il un moyen de contourner ce souci? ou bien est ce moi qui manipule mal mes outils Microsoft?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Il est EXTREMENENT dangereux d'utiliser le mécanisme d'IR CASCADE. En effet imaginez que vous faisiez cela sur la relation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CLIENT => COMMANDE => LIGNE COMMANDE => LIVRAISON => PAIEMENT
    avec les cardinalité moyennes suivantes :
    1 client => 100 commandes  
    1 commande => 10 détail de commande
    1 commande => 3 livraison
    1 livraison => 3 paiement.
     
    En supprimant 1 client en IR cascade vous allez imposer à SQL Server une transaction qui va donc supprimer :
                  1 ligne de client
                100 ligne de commande
    100 * 10 = 1000 lignes de détail de commande
    1000 * 3 = 3000 lignes de livraison
    3000 * 3 = 9000 lignes de paiement
    ----------------
              13101 lignes supprimées dans 5 tables...
    Vous risquez deux choses : que votre utilisateur attende un bon moment avant de pouvoir continuer d'utilise le SGBDR après avoir déclenché la suppression. Mais vous risquez pire : le blocage car pour la suppression de lignes il faut qu'aucun autre utilisateur ne soit en train de les manipuler. Au pire du pire vous risquez l'interblocage.

    C'est pourquoi on utilise très rarement l'IR cascade en production.

    C'est aussi pour cet raison que SQL Server interdit les références multiples, circulaires et autres en mode cascade et ce à juste titre !

    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/ * * * * *

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Merci pour cette reponse, je suis quand meme etonné que cela ne soit pas gerer... , je vais devoir donc coder dans mon appli ...
    Je ne comprends pas trop le but de cette fonctionnalite si elle ne peut gerer efficacement ce genre de probleme car dans mon cas, je desirai que la suppression en cascade fasse ce qu elle promet, c est a dire une suppression en cascade ...
    Bon tant pis... merci beaucoup SQLPro

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    C'est dommage le but d'un SGBD relationnelle, c'est de pouvoir faire des updates ou des deletes en cascade...

    Pour ma part je n'active jamais le "ON DELETE CASCADE" c'est beaucoup trop dangereux pour les bases en prod. Le client perd son historique, en moyenne il n’aime pas trop, à juste titre.

    Mais bon se voir bloquer sur le "ON UPDATE CASCADE", il faut m'expliquer...

    Exple :
    Le client rentre la fiche technique de son véhicule, on suppose que la clef primaire est la plaque d'immatriculation.

    Il crée des tournées pour ce véhicule.

    Le lendemain le chauffeur vient et l'averti qu'il a fait une erreur sur l'immatriculation.

    SQL SERVER ne sait pas faire ? Le Client est donc obligé de recréer un autre véhicule et de lui réassigné les mêmes tournées parce le SGBD ne sait pas faire...

    En gros il aura : 1 doublons et effectué une double saisie à cause du "ON UPDATE CASCADE".

    Ou alors pire SQL SERVER permet d'utiliser le "ON UPDATE CASCADE" mais pas trop quand même, le développeur est peut être totalement incompêtant !!!

    Bref...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 126
    Points : 143
    Points
    143
    Par défaut
    Dans ton exemple je m'interrogerais sur la pertinence d'une clé primaire qui peut bouger du jour au lendemain

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Vous avez apparament mal compris ce que j'ais dit.

    Je n'ais jamais dit que SQL Server ne savait pas gérer le mode d'IR CASCADE. Il le gère parfaitement.
    ON UPDATE CASCADE et ON DELETE CASCADE.

    Démonstration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    CREATE TABLE T1 
    (A INT PRIMARY KEY, 
     B INT);
     
    CREATE TABLE T2 
    (C INT PRIMARY KEY, 
     D INT FOREIGN KEY REFERENCES T1 (A) 
           ON UPDATE CASCADE 
           ON DELETE CASCADE);
     
    INSERT INTO T1 VALUES (1, 1);
    INSERT INTO T1 VALUES (2, 2);
     
    INSERT INTO T2 VALUES (3, NULL);
    INSERT INTO T2 VALUES (4, 1);
     
    DELETE FROM T1 
    WHERE  A = 1;
     
    SELECT * 
    FROM   T2;
     
    C           D
    ----------- -----------
    3           NULL
     
    CREATE TABLE T3 (E INT PRIMARY KEY, 
     F INT FOREIGN KEY REFERENCES T2 (C) 
           ON UPDATE CASCADE 
           ON DELETE CASCADE)
     
    INSERT INTO T1 VALUES (1, 1);
    INSERT INTO T2 VALUES (4, 1);
    INSERT INTO T3 VALUES (5, 4);
     
    DELETE FROM T1 
    WHERE  A = 1;
     
    SELECT * 
    FROM   T2;
     
    SELECT * 
    FROM   T3;
     
    CREATE TABLE T4 (G INT PRIMARY KEY, 
     H INT FOREIGN KEY REFERENCES T2 (C) 
           ON UPDATE CASCADE 
           ON DELETE CASCADE);
     
    INSERT INTO T1 VALUES (1, 1);
    INSERT INTO T2 VALUES (4, 1);
    INSERT INTO T3 VALUES (5, 4);
    INSERT INTO T4 VALUES (6, 4);
     
    DELETE FROM T1 
    WHERE  A = 1;
     
    SELECT * 
    FROM   T2;
     
    SELECT * 
    FROM   T3;
     
    SELECT * 
    FROM   T4;

    Etc...

    Mais cela est DANGEREUX ! Un SGBD est fait pour traiter de multiples utilisateurs SIMULTANÉMENT. Si plusieurs font cela en même temps, le verrouillage nécessaire pour faire les suppressions de ligne va pénaliser de plus en plus toutes les utilisateurs jusqu'à devenir bloquant, voir interbloqué !
    C'est pourquoi ce mode est à déconseillé totalement, sauf pour du bricolage...
    C'est d'ailleurs pour cela qu'a été introduit les mode ON DELETE / UPDATE SET NULL et SET DEFAULT destiné à déporter les traitements de suppression aux heures creuses. ENcore faudrait-il que les développeurs sachent s'en servier et n'utilisent jamais que des vues pour toutes manipulation de données (lecture et mise à jours), ce qu'hélas peu d'entre eux font, oubliant par là même le 4 eme niveau de schéma du Dr. Codd : le schéma externe...

    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/ * * * * *

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3
    Points : 5
    Points
    5
    Par défaut
    Il le gère parfaitement mais des fois il met un message disant qu'il ne peut pas le faire... Ce n’est pas super logique.

    Ou alors, il estime le nombre de séquence sur une cascade. Mais bon il devrait mettre un warning, si on aime faire du bricolage, il nous gâche un peux notre plaisir.

    Zut... je vais être obligé de réfléchir sur mes requêtes et la construction de ma BDD, pour ne pas surcharger le serveur .

    Pour vous rassurer, je joue à l'avocat du diable. J'utilise MS SQL SERVER depuis peux et je n'utilise pas les cascades, trop risqué et trop gourmant en ressource.

    Mon exemple était un peu bidon. Une clef primaire qui change tous les quatre matins, ce n’est pas judicieux.


    Cordialement.

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut UPDATE CASCADE
    Bonjour à tous.
    Je reprends cette discussion quelques années plus tard car je suis aujourd'hui confronté au problème avec SQL 2008 et je ne me souviens pas avoir eu le cas lors de mes développements précédents (essentiellement SQL 6.5, 2000 et un peu 2005).
    Malgrès toutes les préconisations de bon sens que j'ai lu dans ce fil, je voulais -assez bêtement j'en conviens - effectuer le report de la modification d'une clé primaire en cascade sur la clé étrangère associée de plus d'une table liées.
    Ca se révèle impossible et m'étonne beaucoup.
    En effet, sans passer à des extrêmes comme évoqués dans le fil et qui nécessitent une gestion plus réfléchie, je suis d'accord pour dire que : ou bien le système assure l'intégrité référentielle - sans récursivité - ou bien il ne le fait pas... mais pas à moitié!
    Je me trouve dans la situation où il va falloir décider quelles tables seront mise à jour automatiquement et les quelles le seront via un trigger qu'il va falloir rédiger et maintenir pour chaque clé étrangère concernée.
    Je trouve que c'est pas top...

Discussions similaires

  1. [MPD] Clé étrangère et double contrainte
    Par dev-linus dans le forum Schéma
    Réponses: 3
    Dernier message: 10/06/2012, 11h40
  2. Réponses: 29
    Dernier message: 25/11/2007, 16h08
  3. [Débutant ACCESS] Contrainte de clés étrangères
    Par elgringo2007 dans le forum Access
    Réponses: 2
    Dernier message: 12/06/2006, 18h56
  4. Réponses: 5
    Dernier message: 28/04/2006, 11h55
  5. Contraintes de clés étrangères non respectées
    Par parfait dans le forum Requêtes
    Réponses: 7
    Dernier message: 28/07/2004, 12h48

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