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 :

Ordre d'un DELETE CASCADE


Sujet :

Développement SQL Server

  1. #1
    Invité
    Invité(e)
    Par défaut Ordre d'un DELETE CASCADE
    Bonjour,

    J'aimerai savoir si on peut contrôler l'ordre dans lequel SQL serveur gère les règles "ON DELETE CASCADE" lorsque qu'une table mère est liée à plusieurs tables filles elles-même liées entres elles.

    Un exemple :
    - Soit une table T0
    - Soit une table T1 ayant une clé étrangère vers T0, avec suppression en cascade
    - Soit une table T2 ayant une clé étrangère vers T0, avec suppression en cascade, et une clé étrangère vers T1, sans suppression en cascade.

    Je souhaite supprimer une ligne de T0.
    Normalement, grâce à mes cascades, SQL Server devrait supprimer les lignées liées dans les tables T1 et T2.
    Deux scénario sont possible :
    - Suppression de la ligne de T2
    - Suppression de la ligne de T1
    => SUCCESS

    - Suppression de la ligne de T1
    => ECHEC car T2 pointe vers T1

    Donc ma question est : puis-je choisir l'ordre dans lequel SQL Serveur repercute les suppressions en cascade sur les tables filles ?

    C'est un peu compliqué, j'espère que j'ai été assez clair !
    Merci d'avance.

  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
    Votre question est idiote. Sachant qu'un ordre SQL est une transaction à part entière, soit tout sera supprimé, soit rien ne le sera. Il n'y a pas de demi mesure et l'ordre n'a donc aucune importance.

    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
    Invité
    Invité(e)
    Par défaut
    Votre réponse l'est tout autant !

    En gros ce que vous me dites, c'est que "ou bien ça marchera, ou bien sa me marchera pas". C'est une remarque pleine de profondeur, mais ça me fais de belles jambes.

    Je reformule donc ma question : comme puis-je m'assurer que ça marche à tous les coups ?
    Dernière modification par Invité ; 20/12/2011 à 13h58.

  4. #4
    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
    Parce que c'est une transaction et que les transaction fonctionnent de manière atomique, c'est à dire en tout ou rien.

    • Soit les contraintes permettent de supprimer toutes les informations de toutes les tables cascadées
    • Soit une seule contrainte empêche de supprimer une seule ligne et dans ce cas rien n'est supprimé.

    Bref, il serait temps pour vous de vous former su ce que sont les transactions dans les SGBDR !
    A lire donc :
    Les techniques des SGBDR
    Transactions et niveau d'isolation

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

  5. #5
    Invité
    Invité(e)
    Par défaut
    Vous seriez aimable d'arrêter de me prendre de haut.
    Vous n'avez toujours pas répondu à ma question : mon sujet demande "comment faire", et vous y répondez en disant "parce-que".

    Je ne vous parle pas de transaction mais du fonctionnement du "on delete cascade". Le fait que tout cela fasse parti d'une transaction est très interessant, mais ça n'est pas de ça que je parle, ce que vous verriez si vous preniez le temps de lire vraiment ma question.

    Vous êtes donc à coté de la plaque. Merci donc de me répondre vraiment et d'arrêter de me donner des leçons stupides !

  6. #6
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Citation Envoyé par darnold Voir le message
    Donc ma question est : puis-je choisir l'ordre dans lequel SQL Serveur repercute les suppressions en cascade sur les tables filles ?
    Non ce n'est pas possible.

    J'ai fait quelque tests, ça fonctionne sans soucis.
    SQL Server semble se débrouiller tout seul pour gérer ce genre de références "circulaires" (ou en tout cas plusieurs chemins de cascade et dépendances).
    Donc rien à faire.

    Sinon si vous n'êtes pas convaincu désactivez la FK sur t2 référencant t1 avant la suppression dans t0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE t2 NOCHECK CONSTRAINT FK_t2_vers_t1
    Ou alors, enlevez les CASCADE et utilisez un trigger INSTEAD OF pour faire les suppressions vous même.

  7. #7
    Invité
    Invité(e)
    Par défaut
    SQL Server semble se débrouiller tout seul pour gérer ce genre de références "circulaires" (ou en tout cas plusieurs chemins de cascade et dépendances).
    Donc rien à faire.
    Ok, j'avais bien noté que il semblait se débrouiller tout seul, mais je ne savais pas si c'était un coup de bol ou s'il était capable de gérer le bazar tout seul.

    Sinon la solution du "ALTER TABLE t2 NOCHECK CONSTRAINT FK_t2_vers_t1" me parrait bonne aussi.

    Je passe le sujet en résolu.
    Merci !

  8. #8
    En attente de confirmation mail
    Homme Profil pro
    Lead Developper
    Inscrit en
    Janvier 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Lead Developper
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 1
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Cette discussion n'est certes pas récente mais elle correspond en tout point au problème de j'ai eu, à savoir un delete sur une table principale qui delete donc en cascade d'autres tables mais mon souci est qu'une des ces tables exécute un trigger qui met à jour une table précédemment touchée par le delete en cascade, ce qui me fait un beau plantage. Vous me direz, la désactivation du trigger puis sa réactivation peuvent suffire, oui c'est vrai.
    J'ai donc utilisé le plan d'exécution sur ma BDD : l'ordre des delete suit l'ordre alphabétique selon le nom des tables. Trouvant cela étonnamment suspect, et par curiosité, j'ai fait différents tests pour en savoir plus.

    J'ai alors fait le test suivant :
    1 - Création d'une table T2
    2 - Création d'une table T4
    3 - Création d'une table T3
    4 - Création d'une table T1
    5 - Création d'une contrainte de T4 vers T1
    6 - Création d'une contrainte de T2 vers T1
    7 - Création d'une contrainte de T3 vers T1

    Quand je fais un delete sur T1, l'ordre des tables touchées par la cascade est T4 puis T2 puis T3.
    Si je supprime la contrainte des T2 vers T1 et que je la recrée l'ordre devient T4 puis T3 puis T2 : la cascade de delete suit donc l'ordre de création des contraintes indépendamment de l'ordre de création des tables. Cela peut être utile, ...

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par DukeMan Voir le message
    Quand je fais un delete sur T1, l'ordre des tables touchées par la cascade est T4 puis T2 puis T3.
    Si je supprime la contrainte des T2 vers T1 et que je la recrée l'ordre devient T4 puis T3 puis T2 : la cascade de delete suit donc l'ordre de création des contraintes indépendamment de l'ordre de création des tables. Cela peut être utile, ...
    Je doute fort que l'on puisse ériger en règle ce que vous constatez avec un test unique sur un jeu de tables unique !
    D'ailleurs, n'y a-t- il pas des versions SQL server qui traitent les DELETE en multi-threading ? auquel cas...

  10. #10
    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
    Citation Envoyé par DukeMan Voir le message
    Bonjour,

    Cette discussion n'est certes pas récente mais elle correspond en tout point au problème de j'ai eu, à savoir un delete sur une table principale qui delete donc en cascade d'autres tables mais mon souci est qu'une des ces tables exécute un trigger qui met à jour une table précédemment touchée par le delete en cascade, ce qui me fait un beau plantage. Vous me direz, la désactivation du trigger puis sa réactivation peuvent suffire, oui c'est vrai.
    J'ai donc utilisé le plan d'exécution sur ma BDD : l'ordre des delete suit l'ordre alphabétique selon le nom des tables. Trouvant cela étonnamment suspect, et par curiosité, j'ai fait différents tests pour en savoir plus.

    J'ai alors fait le test suivant :
    1 - Création d'une table T2
    2 - Création d'une table T4
    3 - Création d'une table T3
    4 - Création d'une table T1
    5 - Création d'une contrainte de T4 vers T1
    6 - Création d'une contrainte de T2 vers T1
    7 - Création d'une contrainte de T3 vers T1

    Quand je fais un delete sur T1, l'ordre des tables touchées par la cascade est T4 puis T2 puis T3.
    Si je supprime la contrainte des T2 vers T1 et que je la recrée l'ordre devient T4 puis T3 puis T2 : la cascade de delete suit donc l'ordre de création des contraintes indépendamment de l'ordre de création des tables. Cela peut être utile, ...
    Le seul ordre qui est suivi, c'est l'ordre dans lequel l'optimiseur décide d'optimiser la suppression lorsque le DELETE en cascade est multi branche.....

    En règle général pour un delete l'ordre n'a pas de conséquence majeur sur les performances puisque au globale, le volume sera le même est la durée identique quelque soit le bout que l'on prend.

    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. On Delete Cascade
    Par malbarre dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/07/2006, 11h40
  2. SQL Delete Cascade
    Par mschoum dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/06/2006, 14h18
  3. [SQL 2K5] Pb : ON DELETE CASCADE : référence circulaire
    Par n00bi dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 29/05/2006, 08h48
  4. [SQL2K] delete cascade d'une table sur elle même
    Par StormimOn dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2006, 16h28
  5. Delete cascade --> problème de temps de traitement
    Par celine31 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 11/01/2006, 12h03

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