Besoin d'aide pour trigger dans mysql [Résolu]

Darkgattsu 6 Messages postés lundi 29 juin 2009Date d'inscription 23 août 2010 Dernière intervention - 14 janv. 2010 à 11:30 - Dernière réponse : cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 18 janv. 2010 à 11:49
3
Merci
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

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 17 janv. 2010 à 23:33
0
Merci
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
Commenter la réponse de cs_Delphiprog
Darkgattsu 6 Messages postés lundi 29 juin 2009Date d'inscription 23 août 2010 Dernière intervention - 18 janv. 2010 à 11:16
0
Merci
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
Commenter la réponse de Darkgattsu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.