Besoin d'aide pour trigger dans mysql

Résolu
Darkgattsu Messages postés 6 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 23 août 2010 - 14 janv. 2010 à 11:30
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 18 janv. 2010 à 11:49
Salut, c'est mon tout premier message sur ce fofo alors qu'il m'aide quasiment au quotidien depuis 2ans ^^. Je suis en prépa IG Analyste Programmeur et je réalise actuellement mon stage de 2eme année.

Alors voici mon problème, j'essaye de créer un trigger before insert sur une bdd mysql, seulement je cherche à annuler l'insertion selon tel ou tel cas.
J'ai lu par ci par la qu'on pouvait utiliser return false (apparemment ça ne marche pas) ou RAISERROR (c'est ce que j'ai laissé ici) pour stopper l'insert.

Voici mon trigger, j'ai vérifié les requêtes au cas où il y aurait une erreur sur les noms de champ, ça ne vient pas de là.

Delimiter |
Create trigger insert_marche BEFORE INSERT ON marché FOR EACH ROW
BEGIN
If (NEW.IDpdv <>NULL and NEW.IDagence=NULL and NEW.IDportefeuille=NULL) or (NEW.IDpdv=NULL and NEW.IDagence<>NULL and NEW.IDportefeuille=NULL) or (NEW.IDpdv =NULL and NEW.IDagence=NULL and NEW.IDportefeuille<>NULL) then
BEGIN
DECLARE num_agence varchar(5);
Select IDagence FROM pointdevente Where IDagence=NEW.IDagence INTO num_agence;
IF num_agence <> NULL THEN
RAISERROR[u];
Else
BEGIN
Select IDagence FROM portefeuille Where IDagence=NEW.IDagence INTO num_agence/u;
IF num_agence <> NULL THEN
RAISERROR;
Else
Insert into marché(IDagence,IDportefeuille,IDpdv,nommarche) values (NEW.IDagence, NEW.IDportefeuille, NEW.IDpdv, NEW.nommarche) ;
END ;
END ;
Else
RAISERROR;
END|


voilà l'erreur se produit au niveau du soulignement.
merci d'avance.

3 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 janv. 2010 à 11:49
Laisse tomber les commit et rollback dans les triggers, tu fais fausse route. Je crois comprendre qu'il y a une grande confusion entre une PS et un trigger dans ton esprit...

Pour les autres questions, je te renvoie vers cet excellent tutoriel : La gestion des erreurs en SQL procédural avec MySQL
par Alain Defrance.
Toutes les réponses s'y trouvent

Que la lumière soit...
May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

[url=http://www.helpmysql.org/fr/petition]Sauvons My
3
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
17 janv. 2010 à 23:33
Bonsoir,

Personnellement, je ne me risquerais pas à déclencher des erreurs dans des triggers !!! Ca risque vite de devenir incontrôlable.

D'autre part, le code de ton trigger est censé s'exécuter avant l'insertion d'un enregistrement dans la table marché (un conseil : évites les noms accentués...). Or, dans ce même trigger, tu veux exécuter une commande INSERT !?
Es-tu sûr de bien avoir bien compris l'utilisation des triggers ?
En supposant que ton code puisse fonctionner, alors il déclenchera à son tour le trigger qui essaiera d'insérer, ce qui déclenchera le trigger qui essaiera.... Et patatras, la boucle sans fin !
Revois ton code en le simplifiant et tu verras :
1- tu peux faire bien simple
2- tu peux te passer des 'RaiseError' qui ne sont disponibles que dans les toutes dernières versions de MySQL.

Ce que tu souhaites faire a plus sa place dans une procédure stockée que dans un trigger.

May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

[url=http://www.helpmysql.org/fr/petition]Sauvons My
0
Darkgattsu Messages postés 6 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 23 août 2010
18 janv. 2010 à 11:16
Merci d'avoir répondu et vous avez bien raison en parlant de procédures stockées, vu que la plupart de mes insertions vont etre géré par des PS.

Juste pour savoir, comment peut-on stopper l'insertion avec un trigger?
J'ai entendu parlé de rollback et commit mais je n'arrive pas vraiment à les utiliser.

Un résumé rapide sur l'utilisation et la syntaxe du trigger stoppant une insertion serait très appréciée
0
Rejoignez-nous