상황
특정 서버에서 DUMP 한 아래 프로시저를 다른 서버에 반영하려고 합니다.
1 2 3 4 5 6 7 | CREATE DEFINER=test@localhost PROCEDURE TEST() BEGIN set @s=CONCAT('truncate table test', DATE_FORMAT(NOW(), '%c') % 3); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt; END | cs |
이 때 오류가 발생했습니다.
Error Code: 1064. 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 |
오류 원인 및 해결 방안
1차 원인 - DEFINER 는 삭제
AS-IS 서버의 test 계정으로 define 되었기 때문에 definer 에 test 계정이 작성되어 DUMP 됩니다.
TO-BE 서버에는 TEST 계정이 없거나 환경이 다를 수 있으므로 definer 구문을 제거해야 합니다.
1 2 3 4 5 6 7 | CREATE PROCEDURE TEST() BEGIN set @s=CONCAT('truncate table test', DATE_FORMAT(NOW(), '%c') % 3); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt; END | cs |
2차 원인 - DELIMITER $$ 의 부재
프로시저를 신규로 생성 시에 많은 구문에서 ';' 를 포함하기 때문에 정확한 종료시점을 알 수 없어서 에러가 발생합니다.
그래서 시작과 끝을 확실히 알 수 있도록 정의를 해주어야 합니다.
1 2 3 4 5 6 7 8 9 | DELIMITER $$ CREATE PROCEDURE TEST() BEGIN set @s=CONCAT('truncate table test', DATE_FORMAT(NOW(), '%c') % 3); PREPARE stmt FROM @s; EXECUTE stmt; DEALLOCATE PREPARE stmt; END$$ DELIMITER; | cs |
2차 원인에서 작성한 쿼리로 수행하게 되면 프로시저가 생성됩니다.
일반적으로 객체 앞뒤로 ' 나 ` 를 작성을 안하거나 갯수가 일치하지 않아 문법오류가 발생하는 경우도 있으나
이번 같은 경우는 이게 문법오류인가..(?) 싶어서 정리하였습니다.
'Database > MySQL' 카테고리의 다른 글
[MySQL] Auto Increment 컬럼 초기화 방법과 위험성에 대해서 (0) | 2020.09.10 |
---|---|
[MySQL] 트랜잭션 격리 수준, 레벨 (0) | 2018.10.18 |
[MySQL] 실행한 쿼리를 파일로 확인하기 (0) | 2018.10.17 |
[MySQL] 인덱스 종류 및 고려사항 (단일, 복합, 클러스터, 논클러스터, 커버드) (0) | 2018.10.17 |
[MySQL] MySQL 이중화(HA구성)하기 (0) | 2018.10.08 |