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

SQL Procédural MySQL Discussion :

Fatal Error : Trigger Before Delete


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 59
    Par défaut Fatal Error : Trigger Before Delete
    Bonjour à tous,

    J'ai un problème de durée d'exécution trop longue avec un trigger before delete.
    "Fatal error: Maximum execution time of 300 seconds exceeded"
    Grosso modo j'ai une table 'news', une table 'usager' et une table 'historique', quand j'efface une news je souhaite que mon trigger efface automatiquement les lignes correspondant à cette news dans ma table 'historique'.



    J'ai essayé de modifier mon trigger, avec ou sans jointure, mais le résultat est toujours le même.
    Voici les contraintes de mes tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- Contrainte pour la table 'news'
    ALTER TABLE `news`
      ADD CONSTRAINT `FK_news_usager` FOREIGN KEY (`idusager`) REFERENCES `usager` (`idusager`);
     
    -- Contraintes pour la table `historique`
    ALTER TABLE `historique`
      ADD CONSTRAINT `FK_histo_adresse` FOREIGN KEY (`idadresse`) REFERENCES `adresse` (`idadresse`),
      ADD CONSTRAINT `FK_histo_annuaire` FOREIGN KEY (`idannuaire`) REFERENCES `annuaire` (`idannuaire`),
      ADD CONSTRAINT `FK_histo_catref` FOREIGN KEY (`idcatref`) REFERENCES `catref` (`idcatref`),
      ADD CONSTRAINT `FK_histo_contact` FOREIGN KEY (`idcontact`) REFERENCES `contact` (`idcontact`),
      ADD CONSTRAINT `FK_histo_ficheref` FOREIGN KEY (`idficheref`) REFERENCES `ficheref` (`idficheref`),
      ADD CONSTRAINT `FK_histo_missionref` FOREIGN KEY (`idmissionref`) REFERENCES `missionref` (`idmissionref`),
      ADD CONSTRAINT `FK_histo_news` FOREIGN KEY (`idnews`) REFERENCES `news` (`idnews`),
      ADD CONSTRAINT `FK_histo_usager` FOREIGN KEY (`idmodificateur`) REFERENCES `usager` (`idusager`);
    La dernière version de mon Trigger est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DROP TRIGGER IF EXISTS deleteNewsHisto;
    DELIMITER //
    CREATE TRIGGER deleteNewsHisto 
    BEFORE DELETE ON news
    FOR EACH ROW
    BEGIN
    DELETE FROM historique 
    INNER JOIN news 
    ON news.idnews = historique.idnews
    WHERE historique.idnews = news.OLD.idnews;
    END
    //
    DELIMITER ;
    Si vous voyez ce qui ne va pas, je vous écoute d'une oreille attentive.

    Question supplémentaire: si je veux ajouter un delete à ce trigger pour qu'il efface en plus les occurences liées à ma news dans une autre table, est-ce possible? (je veux dire sans écrire un autre trigger mais en ajoutant seulement cette instruction à mon trigger existant).

  2. #2
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Petite question, a quoi sert votre jointure dans le delete du trigger ?

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 59
    Par défaut
    Comme je le disais : "j'ai testé pas mal de modification sur mon trigger, du plus logique au plus farfelu... en désespoir de cause."

    Donc la réponse est: surement à rien mon capitaine! Mais sans cette jointure il ne fonctionne malheureusement pas mieux.

  4. #4
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    idnews dans votre table historique est bien une clé primaire ?

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 59
    Par défaut
    Non dans la table 'historique' le champ 'idnews' est en clé étrangère pas primaire. 'idnews' est la clé primaire de la table 'news'.

  6. #6
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    mettez urgemment un index sur cette colonne alors

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 59
    Par défaut
    Vous me suggérez de mettre un index sur chaque clé étrangère de la table 'historique' ?

    Ceci devrait en effet diminuer le temps de recherche lors de mes requêtes (et je vous remercie pour ce conseil) mais cela ne devrait pas avoir d'incidence sur le "non-fonctionnement" de mon trigger, n'est-il pas?

  8. #8
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Maximum execution time of 300 seconds exceeded
    Si vous diminuez de manière significative le traitement de vos requêtes, vous ne devriez pas tomber dans ce timeout.

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 59
    Par défaut
    Citation Envoyé par Yanika_bzh Voir le message
    Si vous diminuez de maniere significative le traitement de vos requetes, vous ne devriez pas tomber dans ce timeout.
    Il n'y a (pour l'instant) qu'une dizaine de lignes dans ma table historique, je ne crois donc pas que mon problème vient de là. A mon avis mon trigger est mal écrit, c'est ce qui provoque le timeout. Pour une raison conceptuelle ou syntaxique mon trigger ne peut tout simplement pas être lu.

    C'est pour ça que j'ai fourni une image de mon MPD et le bout de code correspondant aux contraintes des tables, quelque chose a du m'échapper.

  10. #10
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    pourquoi mettre delimiter dans le script de votre trigger ?

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 59
    Par défaut
    Aucune idée... dans les exemples que j'ai trouvés il y a avait souvent DELIMITER je l'ai donc intégré à mon trigger.

    Je viens de testé sans, changement de message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE OR REPLACE TRIGGER deleteNewsHisto BEFORE
    DELETE ON news FOR EACH ROW BEGIN DELETE FROM historique WHERE historique.idnews = news.OLD.idnews;
    MySQL a répondu:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIGGER deleteNewsHisto BEFORE DELETE ON news FOR EACH ROW BEGIN
    DELETE FRO' at line 1

  12. #12
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Je posais la question, car il n'y a pas d'autres instructions dans votre trigger, alors j'ai pensé que le source du trigger n’était pas complet...

  13. #13
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 056
    Par défaut
    Bonjour,

    Ce que je ne comprends pas bien, c'est pourquoi faire un trigger qui a l'air de faire ce pour quoi le ON DELETE CASCADE d'une clé étrangère est prévu ?
    Pourquoi vouloir réinventer la poudre ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  14. #14
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Bonjour,

    Petite précision :

    Vous me suggérez de mettre un index sur chaque clé étrangère de la table 'historique' ?

    Ceci devrait en effet diminuer le temps de recherche lors de mes requêtes (et je vous remercie pour ce conseil) mais cela ne devrait pas avoir d'incidence sur le "non-fonctionnement" de mon trigger, n'est-il pas?
    Si vous utilisez des tables InnoDB, pas besoin de créer un index sur les colonnes représentant des foreign keys, InnoDB le fait automatiquement

Discussions similaires

  1. Pbm trigger before Delete
    Par akli_agha dans le forum Firebird
    Réponses: 8
    Dernier message: 13/03/2010, 16h09
  2. Pb avec Trigger before delete : ORA-04091
    Par nloubes dans le forum Oracle
    Réponses: 1
    Dernier message: 22/10/2009, 14h34
  3. Erreurs sur un trigger BEFORE DELETE
    Par Daikyo dans le forum PL/SQL
    Réponses: 1
    Dernier message: 13/06/2008, 02h13
  4. [8i] Trigger before ou after delete
    Par Débéa dans le forum Oracle
    Réponses: 3
    Dernier message: 15/02/2006, 13h49
  5. class php5 - Fatal error: main() [function.main]
    Par tom261285 dans le forum Langage
    Réponses: 3
    Dernier message: 21/01/2005, 14h41

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