我的迁移工作正常,但现在我的部署策略已更改,因此我必须使用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
命令
我的触发器的一个迁移文件如下所示:
<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命令添加分隔符的特殊上下文,除非我有适当的解决方案,否则这看起来很难看。
答案 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 ;