Liquibase updateSQL for mysql with stored routines

时间:2014-11-26 12:12:48

标签: mysql database-migration liquibase

我的迁移工作正常,但现在我的部署策略已更改,因此我必须使用updateSQL命令生成完整的模式。但它似乎没有在一轮附近添加前/后分隔符,例如

DROP TRIGGER IF EXISTS `labels_before_ins_tr`;

CREATE DEFINER='root'@'localhost' TRIGGER `labels_before_ins_tr` BEFORE INSERT ON `labels` FOR EACH ROW BEGIN
 ...
END 

DROP TRIGGER IF EXISTS `labels_before_upd_tr`;

我的期望是:

DROP TRIGGER IF EXISTS `labels_before_ins_tr`;
delimiter ;;        
CREATE DEFINER='root'@'localhost' TRIGGER `labels_before_ins_tr` BEFORE INSERT ON `labels` FOR EACH ROW BEGIN
 ...
END 
;;
delimiter ;    

DROP TRIGGER IF EXISTS `labels_before_upd_tr`;

我们如何使用liquibase updateSQL生成此行为。请注意,使用update命令

时,mysql迁移工作正常

我的触发器的一个迁移文件如下所示:

<changeSet id="1376897476-30" author="sakhunzai" runOnChange="true" >
 <sql>DROP TRIGGER IF EXISTS `labels_before_ins_tr`</sql>        
 <sqlFile endDelimiter="" splitStatements="false" path="sql/30_labels_before_ins_tr.sql" relativeToChangelogFile="true" />
 <rollback>DROP TRIGGER `labels_before_ins_tr`</rollback>           
</changeSet>

修改

我调整了迁移文件以生成所需的输出:

<changeSet id="1376897476-30" author="sakhunzai" runOnChange="true" >
     <sql endDelimiter="" splitStatements="false">DROP TRIGGER IF EXISTS `labels_before_ins_tr`; delimiter //</sql>        
     <sqlFile endDelimiter=" //" splitStatements="false" path="sql/30_labels_before_ins_tr.sql" relativeToChangelogFile="true" />
     <sql endDelimiter="" splitStatements="false">delimiter  ;</sql>
     <rollback>DROP TRIGGER `labels_before_ins_tr`</rollback>           
    </changeSet>

现在updateSQL命令的输出看起来不错,但是update命令会出现此错误:

Unexpected error running Liquibase: Error executing SQL DROP TRIGGER IF EXISTS `labels_before_ins_tr`; delimiter //: 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 'delimiter //' at line 1 

sql语句DROP TRIGGER IF EXISTS labels_before_ins_tr ; delimiter //在mysql的contenxt中是正确的,但是update命令失败可能它期望;甚至//终止声明

最后我只有一个选项,即用户使用updateSQL命令添加分隔符的特殊上下文,除非我有适当的解决方案,否则这看起来很难看。

1 个答案:

答案 0 :(得分:0)

我最终遇到了这个解决方案来生成有效的sql,它可以同时使用update和updateSQL命令。

 <changeSet id="1376897476-30" author="sakhunzai" runOnChange="true" >
 <sql endDelimiter=";\ndelimiter $$">DROP TRIGGER IF EXISTS `labels_before_ins_tr`</sql>        
 <sqlFile endDelimiter="\n$$\ndelimiter ;" splitStatements="false" path="sql/30_labels_before_ins_tr.sql" relativeToChangelogFile="true" />
 <rollback>DROP TRIGGER `labels_before_ins_tr`</rollback>           
</changeSet>

来自updateSQL的输出将是

DROP TRIGGER IF EXISTS `labels_before_ins_tr`;
delimiter $$        
CREATE DEFINER='root'@'localhost' TRIGGER `labels_before_ins_tr` BEFORE INSERT ON `labels` FOR EACH ROW BEGIN
 ...
END 
$$
delimiter ;