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 16/04/2007, 10h40   #1
Futur Membre du Club
 
Inscription : avril 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 42
Points : 16
Points : 16
Par défaut Probleme de TRIGGER

Bonjour,

J'ai un petit problème avec la création d'un trigger. J'ai recherché sur le net mais je ne trouve pas d'exemple ressemblant à ce que je veux faire (enfin j'en ai trouvé un mais bizarrement, chez moi ça fonctionne pas !)

Voici mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
CREATE TABLE ENE_SNAP_02_01_10 AS (SELECT SIRET,CCM,COMMUNE,
IF (S.EFFECTIF<> "N",R.VALUE*S.EFFECTIF,0) AS E14,
IF (S.EFFECTIF<> "N",R1.VALUE*S.EFFECTIF,0) AS E15, 
IF (S.EFFECTIF<> "N",R2.VALUE*S.EFFECTIF,0) AS E16,
IF (S.EFFECTIF<> "N",R3.VALUE*S.EFFECTIF,0) AS E17
FROM SRC S, RAT R, RAT R1, RAT R2, RAT R3 
WHERE R.VAR="C14" AND R1.VAR="C15" AND R2.VAR="C16" AND R3.VAR="C17" AND SNAP="02 01 10");
 
DELIMITER $$
CREATE OR REPLACE TRIGGER MAJ_SRC AFTER INSERT OR UPDATE OR DELETE ON SRC
FOR EACH ROW
BEGIN
IF INSERTING THEN
BEGIN
INSERT INTO ENE_SNAP_02_01_10 SELECT NEW.SIRET,NEW.CCM,NEW.COMMUNE,R.VALUE*NEW.EFFECTIF,R1.VALUE*NEW.EFFECTIF,R2.VALUE*NEW.EFFECTIF,R3.VALUE*NEW.EFFECTIF FROM ENE_SNAP_02_01_10, RAT R, RAT R1,RAT R2,RAT R3 WHERE R.VAR="C14" AND R1.VAR="C15" AND R2.VAR="C16" AND R3.VAR="C17";
exception
when dup_val_on_index then
BEGIN
UPDATE ENE_SNAP_02_01_10 ,RAT SET ENE_SNAP_02_01_10.E14=RAT.VALUE*NEW.EFFECTIF WHERE ENE_SNAP_02_01_10.SIRET=OLD.SIRET AND RAT.VAR="C14" AND SIRET=NEW.SIRET;
UPDATE ENE_SNAP_02_01_10 ,RAT SET ENE_SNAP_02_01_10.E15=RAT.VALUE*NEW.EFFECTIF WHERE ENE_SNAP_02_01_10.SIRET=OLD.SIRET AND RAT.VAR="C15" AND SIRET=NEW.SIRET;
UPDATE ENE_SNAP_02_01_10 ,RAT SET ENE_SNAP_02_01_10.E16=RAT.VALUE*NEW.EFFECTIF WHERE ENE_SNAP_02_01_10.SIRET=OLD.SIRET AND RAT.VAR="C16" AND SIRET=NEW.SIRET;
UPDATE ENE_SNAP_02_01_10 ,RAT SET ENE_SNAP_02_01_10.E17=RAT.VALUE*NEW.EFFECTIF WHERE ENE_SNAP_02_01_10.SIRET=OLD.SIRET AND RAT.VAR="C17" AND SIRET=NEW.SIRET;
END;
END;
ELSEIF UPDATING THEN
BEGIN
UPDATE ENE_SNAP_02_01_10 ,RAT SET ENE_SNAP_02_01_10.E14=RAT.VALUE*NEW.EFFECTIF WHERE ENE_SNAP_02_01_10.SIRET=OLD.SIRET AND RAT.VAR="C14";
UPDATE ENE_SNAP_02_01_10 ,RAT SET ENE_SNAP_02_01_10.E15=RAT.VALUE*NEW.EFFECTIF WHERE ENE_SNAP_02_01_10.SIRET=OLD.SIRET AND RAT.VAR="C15";
UPDATE ENE_SNAP_02_01_10 ,RAT SET ENE_SNAP_02_01_10.E16=RAT.VALUE*NEW.EFFECTIF WHERE ENE_SNAP_02_01_10.SIRET=OLD.SIRET AND RAT.VAR="C16";
UPDATE ENE_SNAP_02_01_10 ,RAT SET ENE_SNAP_02_01_10.E17=RAT.VALUE*NEW.EFFECTIF WHERE ENE_SNAP_02_01_10.SIRET=OLD.SIRET AND RAT.VAR="C17";
END;
ELSEIF DELETING THEN
BEGIN
DELETE FROM ENE_SNAP_02_01_10 WHERE SIRET=OLD.SIRET;
END;
END IF;
END$$
Voici l'erreur qui m'est renvoyée :

Code :
1
2
3
4
ERROR 1064 (42000): 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 MAJ_SRC AFTER INSERT OR UPDATE OR DELETE ON SRC
FOR EACH ROW
BEGIN
IF IN' at line 1
Merci de votre aide.
cactus2078 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2007, 11h11   #2
Futur Membre du Club
 
Inscription : avril 2007
Messages : 42
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 42
Points : 16
Points : 16
En fait le problème se situe au niveau des "or" du trigger !
Quelqu'un aurait-il une idée pour résoudre ce problème car moi je ne comprend pas pourquoi cela créé des erreurs.
J'ai la version 5 de mysql.

Merci
cactus2078 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 22h19   #3
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Citation:
Envoyé par Aide MySQL
trigger_event indique le type de commande qui active le déclencheur. Il peut valoir INSERT, UPDATE ou DELETE
Bref, c'est l'un ou l'autre des événements qui peut figurer dans la déclaration, pas tous
http://dev.mysql.com/doc/refman/5.0/...e-trigger.html

De plus,
Citation:
Envoyé par Aide MySQL
Note : actuellement, les déclencheurs ont les mêmes limitations que les procédures stockées : ils ne peuvent pas contenir de références directes aux tables via leur nom.
Ce qui semble être le cas dans ton script...
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h45.


 
 
 
 
Partenaires

Hébergement Web