我的迁移工作正常,但是现在我的部署策略已更改,因此我必须使用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 ;

10-08 02:26