mysql - 用于带有存储例程的 mysql 的 Liquibase updateSQL

标签 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 EXISTSlabels_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/

相关文章:

postgresql - 使用带有 liquibase 变更集上下文属性的 spring boot 配置文件来管理变更集范围

php - Codeigniter - 1 分钟后删除一条记录

mysql - 有问题的 SQL 实践 - 按 id 而不是创建时间排序

php - get() 不起作用,但 First() 起作用。我需要使用 get() 来获取我的所有数据

python - Django 从所有查询中排除字段

java - 我们如何在 Liquibase XML changlelog 中使用 xinclude ?

liquibase - 从Oracle数据库导出Liquibase数据-generateChangeLog

c# - 包含 2 个数据库的 SQL 查询

mysql - 如何将 MySQL InnoDB 数据库从 Windows 服务器复制到 Ubuntu Linux 服务器?

php - Codeigniter 迁移以更改表