2012-12-01 3 views
2

Je reçois une erreur sur mon déclencheur MYSQL. J'ai utilisé différentes formes de syntaxe que j'ai trouvées ici et ailleurs sur internet mais rien ne semble fonctionner. Voici 3 exemples de syntaxe que j'ai utilisé:Erreur de syntaxe sur MYSQL Trigger

>   CREATE TRIGGER LOG_UPDATE BEFORE UPDATE ON WORKLOG 
>  FOR EACH ROW BEGIN 
>  INSERT INTO WORKLOG_BACKUP VALUES(NULL, CURRENT_TIMESTAMP, NEW.LOGNO, NEW.JOBNO, NEW.EMPLOYEENO, NEW.WORKDATE, NEW.WORKTIME, 
> 'UPDATE');  
>  END; 
>  
>  CREATE TRIGGER LOG_UPDATE BEFORE UPDATE ON WORKLOG 
>  FOR EACH ROW BEGIN 
>  UPDATE WORKLOG_BACKUP SET BACKUPSTAMP = CURRENT_TIMESTAMP, 
>  UPDATE WORKLOG_BACKUP SET LOGNO = NEW.LOGNO, 
>  UPDATE WORKLOG_BACKUP SET JOBNO = NEW.JOBNO, 
>  UPDATE WORKLOG_BACKUP SET EMPLOYEENO = NEW.EMPLOYEENO, 
>  UPDATE WORKLOG_BACKUP SET WORKDATE = NEW.WORKDATE, 
>  UPDATE WORKLOG_BACKUP SET WORKTIME = NEW.WORKTIME, 
>  UPDATE WORKLOG_BACKUP SET CAUSE = 'UPDATE'; 
>  END; 
>  
>  CREATE TRIGGER LOG_UPDATE BEFORE UPDATE ON WORKLOG 
>  FOR EACH ROW BEGIN 
>  INSERT INTO WORKLOG_BACKUP VALUES(
>  SET BACKUPSTAMP = CURRENT_TIMESTAMP, 
>  SET LOGNO = NEW.LOGNO, 
>  SET JOBNO = NEW.JOBNO, 
>  SET EMPLOYEENO = NEW.EMPLOYEENO, 
>  SET WORKDATE = NEW.WORKDATE, 
>  SET WORKTIME = NEW.WORKTIME, 
>  SET CAUSE = 'UPDATE'); 
>  END; 

Je apprécierais toute aide que n'importe qui peut fournir. J'utilise phpmyadmin.

Répondre

4

Pour que votre client MySQL de ne pas interpréter le ; qui met fin à la déclaration INSERT comme la fin de la déclaration CREATE TRIGGER, vous devez l'informer que vous souhaitez utiliser un autre séparateur de déclaration. Dans le client de ligne de commande mysql, vous pouvez le faire avec le DELIMITERcommand. Par exemple, pour changer votre delimiter déclaration à un double point-virgule:

DELIMITER ;; 

Ensuite, vous pouvez faire:

CREATE TRIGGER LOG_UPDATE BEFORE UPDATE ON WORKLOG FOR EACH ROW BEGIN 
    INSERT INTO WORKLOG_BACKUP VALUES (
    NULL, 
    CURRENT_TIMESTAMP, 
    NEW.LOGNO, 
    NEW.JOBNO, 
    NEW.EMPLOYEENO, 
    NEW.WORKDATE, 
    NEW.WORKTIME, 
    'UPDATE' 
); 
END;; 

Cependant, parce que dans ce cas, votre déclenchement ne contient qu'une seule déclaration, vous ne besoin d'utiliser un BEGIN ... END compound statement block et pourrait donc éviter de changer complètement les délimiteurs:

CREATE TRIGGER LOG_UPDATE BEFORE UPDATE ON WORKLOG FOR EACH ROW 
    INSERT INTO WORKLOG_BACKUP VALUES (
    NULL, 
    CURRENT_TIMESTAMP, 
    NEW.LOGNO, 
    NEW.JOBNO, 
    NEW.EMPLOYEENO, 
    NEW.WORKDATE, 
    NEW.WORKTIME, 
    'UPDATE' 
) 
; 
+0

Merci! Cela a fonctionné, cependant maintenant j'ai une nouvelle erreur. Il est dit # 1235 - Cette version de MySQL ne supporte pas encore 'plusieurs déclencheurs avec le même temps d'action et l'événement pour une table' – JamesT

+0

Eh bien, cette erreur est assez claire n'est-ce pas? Il est même clairement [documenté] (http://dev.mysql.com/doc/fr/trigger-syntax.html): "* En particulier, vous ne pouvez pas avoir deux déclencheurs pour une table qui ont le même temps d'activation et l'événement d'activation Par exemple, vous ne pouvez pas définir deux déclencheurs 'BEFORE INSERT' ou deux déclencheurs' AFTER UPDATE' pour une table, ce qui devrait rarement être une limitation importante, car il est possible de définir un déclencheur qui exécute plusieurs instructions en utilisant 'BEGIN. .. END' construction d'instruction composée après 'FOR EACH ROW. (Un exemple apparaît plus loin dans cette section.) *" – eggyal