我的迁移工作正常,但现在我的部署策略发生了变化,所以我必须使用 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;分隔符//
在 mysql 的上下文中是正确的,但是 update
命令失败可能它期望 ;
甚至 //
终止声明
最后我只有一个选择,即使用一个特殊的上下文与 updateSQL 命令一起使用来添加定界符,除非我有适当的解决方案,否则这看起来很难看。
最佳答案
我终于找到了这个解决方案来生成有效的 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 ;
关于mysql - 用于带有存储例程的 mysql 的 Liquibase updateSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27148903/