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

Langage SQL Discussion :

Cascade de clefs étrangères et triggers


Sujet :

Langage SQL

  1. #1
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut Cascade de clefs étrangères et triggers
    Bonjour,

    J'aimerais avoir l'avis des experts en SQL sur le comportement de MySQL qui ignore les éventuels triggers sur les tables touchées par une contrainte CASCADE de clé étrangère.

    J'ai manifesté mon étonnement dans cette discussion mais ericd69, qui semble très bien connaître MySQL, donne une explication de la chose, en la trouvant quand même un tantinet piégeuse !

    Qu'en est-il dans les autres SGBD ?
    Que dit la norme SQL à ce sujet ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  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 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Dans les SGBDR les déclencheurs BEFORE produisent leurs effets avant les contraintes (ce qui permet de donner une valeur à une clef primaire par exemple) et les déclencheurs AFTER produisent leurs effets après les contraintes, sauf contrainte déferrée

    Les contraintes déferrable sont vérifiées en fin de transaction si elles sont effectivement déferrées et s'il y a circularité de référence, la pose de contrainte est empêchée si la contrainte n'est pas INITIALLY DEFFERRED.

    Dans certains SGBDR, les cycles sont interdits. Exemple : SQL Server qui n'accepte pas les contraintes déferrables et interdit les cycles de références.

    Visiblement le très mauvais MySQL ne sait pas vérifier correctement les cycles de références.

    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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Dans les SGBDR les déclencheurs BEFORE produisent leurs effets avant les contraintes (ce qui permet de donner une valeur à une clef primaire par exemple)
    Tu veux dire que dans un TRIGGER BEFORE INSERT je peux utiliser la valeur de l'identifiant auto-incrémenté qui est créé par l'insertion ? Je pensais qu'il fallait que l'insertion ait eu lieu (même non commitée) donc utilisable seulement dans un TRIGGER AFTER INSERT !

    OK pour le reste mais donc, pour en revenir à ma question, si un UPDATE tableA entraîne, par cascade, un UPDATE tableB parce qu'elle référence tableA avec une contrainte ON UPDATE CASCADE, un TRIGGER ON tableB BEFORE UPDATE (ou AFTER UPDATE) doit-il normalement se déclencher ?

    Visiblement le très mauvais MySQL ne sait pas vérifier correctement les cycles de références.
    Un défaut de plus, c'est bien ce qu'il me semblait, même si ce n'est pas un bug puisque apparemment c'est volontaire.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  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 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Tu veux dire que dans un TRIGGER BEFORE INSERT je peux utiliser la valeur de l'identifiant auto-incrémenté qui est créé par l'insertion ? Je pensais qu'il fallait que l'insertion ait eu lieu (même non commitée) donc utilisable seulement dans un TRIGGER AFTER INSERT !
    Dans un trigger BEFORE INSERT, l'auto incrément n'a pas encore été effectué ou affecté. Par exemple dans Oracle, si tu veux auto incrémenter avec une séquence, c'est le moment d'affecter la valeur du séquenceur (NEXT_VALUE....) pour qu'ensuite la contrainte de clef primaire vérifie l'unicité...

    OK pour le reste mais donc, pour en revenir à ma question, si un UPDATE tableA entraîne, par cascade, un UPDATE tableB parce qu'elle référence tableA avec une contrainte ON UPDATE CASCADE, un TRIGGER ON tableB BEFORE UPDATE (ou AFTER UPDATE) doit-il normalement se déclencher ?

    L'ensemble des cascade doit se faire de la même façon. Si nous sommes dans un trigger BEFORE, la cascade n'a pas encore été propagée dans les tables filles. Et dans les triggers after, la propagation est effective... Il y a donc un empilement des appels des déclencheurs "imbriqués".
    Note d'ailleurs que MySQL ne permet pas non plus des triggers récursifs, par exemple de modifier (UPDATE) la table cible d'un déclencheur UPDATE (ni d'ailleurs Oracle), alors que MS SQL Server sait très bien le faire... Idem pour des triggers "ping-pong" : Un trigger sur table A met à jour la table B et vice versa....

    Un défaut de plus, c'est bien ce qu'il me semblait, même si ce n'est pas un bug puisque apparemment c'est volontaire.
    Oui, je dirais plus un bug volontaire par absence de prévision de ce que dois faire un SGBDR !

    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. [trigger] pour supprimer une clef étrangère
    Par Espinosa dans le forum Requêtes
    Réponses: 9
    Dernier message: 03/06/2010, 22h04
  2. Triggers et clefs étrangères
    Par Samuel2202 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 29/08/2008, 12h16
  3. 5 clefs étrangères?
    Par P@t dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/05/2005, 16h52
  4. [wamp5] [Relations] Clefs étrangéres
    Par nebule dans le forum Outils
    Réponses: 6
    Dernier message: 05/10/2004, 11h17
  5. [SQL SERVER 2000] Problème clef étrangére
    Par Tankian dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/05/2004, 10h44

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