我的迁移工作正常,但是现在我的部署策略已更改,因此我必须使用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的内容中是正确的,但是update
命令失败,可能它期望;
甚至//
终止该语句最后,我只有一个选择,即为用户提供一个与updateSQL命令一起使用以添加定界符的特殊上下文,除非我有适当的解决方案,否则这很难看。
最佳答案
我终于想出了这个解决方案,以生成有效的sql,该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 ;