You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:00:51