【问题标题】:SQL enddelimiter in Liquibase 3.1 does not seem to workLiquibase 3.1 中的 SQL enddelimiter 似乎不起作用
【发布时间】:2015-02-17 16:51:36
【问题描述】:

我有一个触发器,如下所示

create or replace trigger departments_bi before insert on departments_test
for each row
when (new.id is null)
begin
 select departments_seq.nextval into :new.id from dual;
end;
/

我指的是使用 sqlfile 的变更集 xml 中的这个触发器

<?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-3.1.xsd">
    <changeSet author="raghav" id="004" runOnChange="true">
     <sqlFile dbms="oracle"
            encoding="ASCII"
            endDelimiter="\n"
            path="Triggers.sql"
            relativeToChangelogFile="true"
            splitStatements="false"
            stripComments="false"/>         
        <rollback>
            drop trigger departments_bi
        </rollback>
    </changeSet>
</databaseChangeLog>

使用 Ant UpdateDatabase 命令生成一个包含所有更改的 SQL 文件。我还使用 exec 任务来执行生成的 SQL,并对目标数据库进行所有更改。

<updateDatabase
            changeLogFile="${checkout}/Trigger.xml"
            driver="oracle.jdbc.OracleDriver"
            url="jdbc:oracle:thin:@${machineId}:${targetDB_Port}:${targetDB}"
            username="${targetDB_User}"
            password="${targetDB_Password}"
            classpathref="classpath"
            outputFile="${env1.WORKSPACE}/Update_MNT.sql"
    />

    <echo message="Beginning to execute Update_MNT.sql to target DB ${targetDB} using username ${targetDB_user}"/>


    <exec dir="${env1.WORKSPACE}" executable="sqlplus" failonerror="true">
        <arg value="${targetDB_User}/${targetDB_Password}@${tnstargetDB}"/>
        <arg value="@Update_MNT.sql"/>
    </exec> 

问题在于生成的 SQL 文件。它包括 Trigger.sql 文件的内容和一个额外的;最后.. 所以在使用 exec 命令执行 Update_MNT.sql 时。 sqlplus 失败是因为额外的 ;在生成的 SQL 文件中的 / 之后。如何解决这个问题?

-- Changeset E:/Jenkins_Liquibase_Test/Triggers.xml::004::raghav
create or replace trigger departments_bi before insert on departments_test
for each row
when (new.id is null)
begin
 select departments_seq.nextval into :new.id from dual;
end;
/;

【问题讨论】:

  • 也许这个forum question 可以提供帮助。
  • 你试过endDelimiter="\n/"(匹配你真正使用的那个)。为什么要通过 SQL*PLus 运行脚本?如果您直接使用liquibase update 运行代码,它应该可以工作。

标签: sql liquibase changeset


【解决方案1】:

endDelimiter、格式化的 SQL 变更集和 updateSQL 命令目前存在一些问题:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 2016-11-29
    • 2016-02-01
    • 2020-09-23
    相关资源
    最近更新 更多