Liquibase 4.11在MySQL中回滚存储过程报SQL语法错误如何解决
问题根因
- 回滚块包含「删除旧存储过程」「创建回滚版本存储过程」两条独立SQL,编写时未在两条语句间设置正确的分隔标记,Liquibase拼接所有带
--rollback前缀的行时,会直接将两条语句连为一体,MySQL无法识别连写语法直接报错。 - 虽然配置了
rollbackEndDelimiter:$$,但仅在所有回滚语句末尾加了一次$$,导致Liquibase将从第一条drop procedure到末尾$$的所有内容识别为单条SQL,最终拼接出的错误语句和报错日志里展示的完全一致,MySQL解析到第二条create procedure位置时触发1064语法错误。
修复方案
调整回滚块的分隔符位置,在两条独立回滚SQL之间单独加$$标记,告诉Liquibase此处为语句分界,修改后的完整变更集代码如下:
--liquibase formatted sql --changeset tester_1:test_id_4 endDelimiter:$$ rollbackEndDelimiter:$$ create procedure get_emp_details( empid varchar(50) ) BEGIN select * from employee where id=empid; END; $$ --rollback drop procedure if exists get_emp_details; --rollback $$ --rollback create procedure get_emp_details( emid varchar(75)) --rollback BEGIN --rollback select * from employee; --rollback END; --rollback $$
验证说明
- 修复后先执行
liquibase update,确认目标版本存储过程正常创建,逻辑符合预期。 - 执行
liquibase rollback-count 1触发单步回滚,无1064报错即为正常,回滚完成后可查看存储过程定义,确认是入参为emid varchar(75)、查询全量employee表的回滚版本即可。 - 代码中新增的
if exists是容错逻辑,避免回滚时存储过程已被手动删除导致流程中断,可根据实际业务场景选择是否保留。
内容的提问来源于stack exchange,提问作者Juliana Ashok
相关产品推荐
相关产品推荐

