2012-12-01 4 views
2

MYSQL 트리거에 오류가 발생합니다. 나는 여기에서 그리고 인터넷의 다른 곳에서 발견 된 다양한 형식의 구문을 사용했지만 아무 것도 작동하지 않는 것 같습니다.MYSQL 트리거 구문 오류

>   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; 

내가 어떤 도움 누군가가 제공 할 수있는 appriciate 것 : 여기 내가 사용했던 구문의 3 가지 예입니다. phpmyadmin을 사용하고 있습니다.

답변

4

INSERT 문을 종료하는 ;CREATE TRIGGER 문 끝으로 해석하지 않으려면 다른 명령문 구분 기호를 사용한다는 것을 사용자에게 알려야합니다.

mysql 명령 줄 클라이언트에서는 DELIMITERcommand을 사용하여이 작업을 수행 할 수 있습니다. 예를 들어, 이중 세미콜론에 문 구분 기호를 변경하려면 다음

다음
DELIMITER ;; 

당신은 할 수 있습니다 :

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;; 

그러나,이 경우 트리거가 하나의 문이 포함되어 있기 때문에, 당신은하지 않습니다 BEGIN ... END compound statement block를 사용해야하기 때문에 모두 변경 구분 기호를 피할 수 :

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

감사합니다! 그러나 이제는 새로운 오류가 발생했습니다. 그것은 말하기를 # 1235 -이 버전의 MySQL은 아직 '하나의 테이블에 대해 동일한 동작 시간과 이벤트를 가진 다중 트리거'를 지원하지 않습니다. – JamesT

+0

글쎄, 그 오류는 꽤 분명하지 않습니까? 분명히 [문서화되어 있습니다] (http://dev.mysql.com/doc/en/trigger-syntax.html) : "* 특히, 정품 인증 시간과 정품 인증 이벤트가 동일한 테이블에는 두 개의 트리거를 사용할 수 없습니다 예를 들어, 테이블에 두 개의'BEFORE INSERT' 트리거 또는 두 개의'AFTER UPDATE' 트리거를 정의 할 수는 없으며, 이것은'BEGIN을 사용하여 여러 명령문을 실행하는 트리거를 정의 할 수 있기 때문에 거의 제한적이지는 않습니다. .. END' 복합 문을 FOR EACH ROW 다음에 작성하십시오 (이 절의 뒷부분에 나오는 예제). * – eggyal