Liquibase runOnChange =“true”但是sqlFile中的存储函数未在数据库中更新以进行更改

时间:2013-02-01 13:27:44

标签: liquibase

我有一个变更集:

<?xml version="1.0" encoding="UTF-8" ?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
        <changeSet id="1359722450-38" author="myname" runOnChange="true" >        
           <sqlFile endDelimiter="" splitStatements="false" path="sql/38_getLeadSet.sql" relativeToChangelogFile="true" />
           <rollback>DROP FUNCTION `getLeadSet`</rollback>          
        </changeSet>
</databaseChangeLog>

由主日志文件

包含

我如果在sql / 38_getLeadSet.sql中更改并运行liquibase更新,我得到:

FUNCTION getLeadSet already exists liquibase.exception.DatabaseException: Error executing SQL ... getLeadSet....

在命令行上。似乎与提及here的问题相同,但我有最新的liquibase版本

感谢任何建议,谢谢

修改

我们需要在sql文件标记之前删除sql,例如

 <sql>DROP FUNCTION if exists `getLeadSet`</sql>    
 <sqlFile endDelimiter="" splitStatements="false" path="sql/38_getLeadSet.sql"  relativeToChangelogFile="true" />
 <rollback>DROP FUNCTION `getLeadSet`</rollback>

P.S)Liquibase版本:2.0.5

2 个答案:

答案 0 :(得分:0)

您是否在更新之前回滚更改?因为函数getLeadSet已经存在,你可能会得到一个sql错误,而不是一个liquiabase。

答案 1 :(得分:0)

runOnChange =“ true”不起作用,相反,我使用了正在工作 runAlways =“ true”

我决定在项目中使用runAlways =“ true”而不是runOnChange =“ true”,因为在部署期间这对我的项目没有太大影响。

liquibase版本是3.5.1