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 :

[CASCADE] Quelle solution choisir ?


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut [CASCADE] Quelle solution choisir ?
    Bonjour à tous,

    Je suis en train de convertir une base de données HF en base de données SQL Server.

    J'ai pas mal de relations entre les tables et j'aimerai, en toute logique, faire des mises à jour/suppression en cascade. Par exemple : la suppression d'un client va engendrer la suppression de ses contrats, et la suppression de ses contrats va engendrer la suppression des lignes des contrats respectifs...

    Voici comment je traduit cela en SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE Contrats (
       Cont_num INTEGER IDENTITY,
       Cont_clicode VARCHAR(10) CONSTRAINT FK_Contrats_clicode FOREIGN KEY (Cont_clicode) REFERENCES Clients (Cli_code) ON UPDATE CASCADE ON DELETE CASCADE
    )
    Seulement, j'ai souvent des messages d'erreurs qui m'indiquent que je ne peux pas créer de multiples contraintes de mise à jour en cascade :

    L'introduction d'une contrainte FOREIGN KEY 'FK_Contrats_clicode' sur la table 'Contrats' 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.
    De ce que j'ai lu en parcourant le forum, il est dangereux d'utiliser les mises à jour en cascade en raison du blocage d'enregistrements.

    Je trouve cela dommage car dans ce cas comment mettre en application ma contrainte ? En passant par des triggers ? Mais le problème ne va-t'il pas être le même ?

    Est-ce que quelqu'un aurait un discours à me proposer sur cette question ? Un article qui traite de cela ? Afin que je puisse apprendre et avancer dans cette problématique.

    Merci d'avance

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    À ce niveau SQL Server est loin d'être parfait avec ces mécanismes de détection de conflit trop sensibles.

    Je pense que le plus simple est d'avoir des clause "ON DELETE SET NULL" (et que les colonnes soient nullable du coup) et d'utiliser des triggers AFTER DELETE pour faire le nettoyage.

  3. #3
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut
    En fait je suis finalement parti du principe qu'il est rare qu'un ID d'enregistrement change (du moins l'utilisateur ne pourra pas le changer), et comme je n'ai pas d'autres traitements à faire à la mise à jour d'un enregistrement : à quoi bon faire un "ON UPDATE CASCADE" ?

    Pour ce qui est du "ON DELETE" je l'ai traduit par des triggers.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Je ne vois pas de scénario où "ON UPDATE CASCADE" ne traduirait pas le mauvais design qui consiste à avoir des clés primaires qui changent.

  5. #5
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut
    Je ne remet pas en cause l'utilité du "ON UPDATE". Seulement dans le cadre de l'application que je dois développer, les utilisateurs n'auront pas l'occasion de modifier les ID des enregistrements, du coup il n'y a pas d'utilité en mon sens.

  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
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    De toute façon le DELETE CASCADE est fortement à déconseiller car n'oubliez pas que toutes les tables impactées seront verrouillées durant la transaction du DELETE. En gros si vous avez des clients, des factures, des lignes de factures, des commandes, des lignes de commandes, des bon de livraison, des lignes de BL.. cela fera 7 tables dérouillées dans la transaction et le tout journalisé, alors qu'en déportant votre delete aux heures creuses par un SET NULL ou SET DEFAULT, cela ira beaucoup mieux....

    A lire sur ce sujet : http://blog.developpez.com/sqlpro/p8...plexes-dans-l/

    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
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    De toute façon le DELETE CASCADE est fortement à déconseiller car n'oubliez pas que toutes les tables impactées seront verrouillées durant la transaction du DELETE. En gros si vous avez des clients, des factures, des lignes de factures, des commandes, des lignes de commandes, des bon de livraison, des lignes de BL.. cela fera 7 tables dérouillées dans la transaction et le tout journalisé, alors qu'en déportant votre delete aux heures creuses par un SET NULL ou SET DEFAULT, cela ira beaucoup mieux....

    A lire sur ce sujet : http://blog.developpez.com/sqlpro/p8...plexes-dans-l/

    A +
    Et est-ce qu'avoir un trigger "AFTER" diffère la prise de lock ?

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Non, c'est pire, le déclencheur étant dans la transaction.

    Tout ceci devrait être fait en delete logique avec une vue et faire les delete physique aux heures creuses.

    le problème c'est que 99% des développeurs oublient de modéliser le modèle externe de données (vues et SP...)

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

  9. #9
    Membre confirmé Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    le problème c'est que 99% des développeurs oublient de modéliser le modèle externe de données (vues et SP...)
    Je plaide coupable...

    Mais merci pour l'article en lien, très utile et on y pense pas toujours...

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Non, c'est pire, le déclencheur étant dans la transaction.
    Je ne suis pas sûr de comprendre.
    C'est pire comment et pourquoi ?

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Dans un trigger vous êtes à l'intérieur d'une transaction. Donc les lignes impactées par le mise à jour ne sont pas encore validées. De ce fait un verrou est posé sur les lignes en cause et perdure pendant tout le traitement effectué dans le trigger !

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

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut TE
    Citation Envoyé par SQLpro Voir le message
    Dans un trigger vous êtes à l'intérieur d'une transaction. Donc les lignes impactées par le mise à jour ne sont pas encore validées. De ce fait un verrou est posé sur les lignes en cause et perdure pendant tout le traitement effectué dans le trigger !

    A +
    D'accord mais n'est-ce pas autant le cas pour les ON DELETE/UPDATE CASCADE ?

  13. #13
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Oui, mais c'est optimisé... Il y a une différence sensible de durée du traitement entre du code SQL interprété et le code C++ d'un moteur relationnel très optimisé. En sus, les contraintes sont préventives (agissent "avant" la mise à jour effective) alors que la majorité des déclencheurs agissent après.

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

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    C'est bon à savoir, merci pour l'info.

Discussions similaires

  1. uploader fichier : quelle solution choisir
    Par Emcy dans le forum Sécurité
    Réponses: 4
    Dernier message: 17/09/2007, 09h10
  2. [Spip] Webzine : quelle solution choisir ?
    Par tonyfromparis dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 06/04/2007, 14h03
  3. [Héritage et Interfaces] Quelle solution choisir ?
    Par BlackWood dans le forum Langage
    Réponses: 10
    Dernier message: 14/11/2006, 11h08
  4. [Popup]Quelle solution choisir ? Quel langage ?
    Par khany dans le forum Général Conception Web
    Réponses: 5
    Dernier message: 20/06/2006, 20h28
  5. [Intranet] Quelle solution choisir ?
    Par stailer dans le forum Développement
    Réponses: 6
    Dernier message: 06/09/2003, 01h17

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