Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/08/2011, 09h52   #1
Nouveau Membre du Club
 
Chauvin Baptiste
Inscription : décembre 2009
Messages : 59
Détails du profil
Informations personnelles :
Nom : Chauvin Baptiste

Informations forums :
Inscription : décembre 2009
Messages : 59
Points : 26
Points : 26
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 :
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 :
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).
BLJ.CHAUVIN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 09h55   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Petite question, a quoi sert votre jointure dans le delete du trigger ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 10h04   #3
Nouveau Membre du Club
 
Chauvin Baptiste
Inscription : décembre 2009
Messages : 59
Détails du profil
Informations personnelles :
Nom : Chauvin Baptiste

Informations forums :
Inscription : décembre 2009
Messages : 59
Points : 26
Points : 26
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.
BLJ.CHAUVIN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 10h26   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
idnews dans votre table historique est bien une clé primaire ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 10h48   #5
Nouveau Membre du Club
 
Chauvin Baptiste
Inscription : décembre 2009
Messages : 59
Détails du profil
Informations personnelles :
Nom : Chauvin Baptiste

Informations forums :
Inscription : décembre 2009
Messages : 59
Points : 26
Points : 26
Non dans la table 'historique' le champ 'idnews' est en clé étrangère pas primaire. 'idnews' est la clé primaire de la table 'news'.
BLJ.CHAUVIN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 11h07   #6
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
mettez urgemment un index sur cette colonne alors
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 11h14   #7
Nouveau Membre du Club
 
Chauvin Baptiste
Inscription : décembre 2009
Messages : 59
Détails du profil
Informations personnelles :
Nom : Chauvin Baptiste

Informations forums :
Inscription : décembre 2009
Messages : 59
Points : 26
Points : 26
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?
BLJ.CHAUVIN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 11h28   #8
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
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.
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 11h49   #9
Nouveau Membre du Club
 
Chauvin Baptiste
Inscription : décembre 2009
Messages : 59
Détails du profil
Informations personnelles :
Nom : Chauvin Baptiste

Informations forums :
Inscription : décembre 2009
Messages : 59
Points : 26
Points : 26
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.
BLJ.CHAUVIN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 12h01   #10
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
pourquoi mettre delimiter dans le script de votre trigger ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 12h23   #11
Nouveau Membre du Club
 
Chauvin Baptiste
Inscription : décembre 2009
Messages : 59
Détails du profil
Informations personnelles :
Nom : Chauvin Baptiste

Informations forums :
Inscription : décembre 2009
Messages : 59
Points : 26
Points : 26
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 :
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
BLJ.CHAUVIN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 12h31   #12
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
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...
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 16h07   #13
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 433
Points : 6 433
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2011, 10h39   #14
Membre confirmé
 
Avatar de GyZmoO
 
Homme Mickaël
Ingénieur développement logiciels
Inscription : février 2006
Messages : 402
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Âge : 27
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 : 402
Points : 238
Points : 238
Envoyer un message via MSN à GyZmoO
Bonjour,

Petite précision :

Citation:
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
__________________
define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.
GyZmoO est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h52.


 
 
 
 
Partenaires

Hébergement Web