我怎样才能找出为什么带有前置条件的Liquibase迁移是MARK_RAN而不是EXECUTED?

时间:2016-03-03 16:33:22

标签: oracle liquibase oracle12c preconditions

我遇到了liquibase变更集的问题。变更集就是这样的:

<changeSet id="recreate-cool-dbobject" author="WTF">
  <preConditions onFail="MARK_RAN">
    <tableExists tableName="table_a" />
    <tableExists tableName="table_b" />
    <tableExists tableName="table_c" />
  </preConditions>
  <comment>…should be executed if Feature X is available</comment>

  <sqlFile
    path="resources/view-definition-v2.sql"
    relativeToChangelogFile="true"
    dbms="oracle"
    stripComments="false"
    endDelimiter="-- /"
  />

  <rollback>
    <sqlFile
      path="resources/view-definition-v1.sql"
      relativeToChangelogFile="true"
      dbms="oracle"
      stripComments="false"
      endDelimiter="-- /"
    />
  </rollback>

</changeSet>

我完全知道table_atable_btable_c确实存在...但仍然一直执行view-definition-v1.sql,而且我多次检查是否SQL内部链接文件有效。如果我直接发出SQL,它就会毫无怨言地执行。

view-definition-v1.sql文件中的SQL有点像

CREATE OR REPLACE VIEW view_tab_abc
(
  col_a
, col_b
, col_c
, CREATED_AT
, UPDATED_AT
) AS
SELECT a.id AS col_a
     , b.id AS col_b
     , c.id AS col_c
     , a.created_at AS CREATED_AT
     , a.updated_at AS UPDATED_AT
  FROM tab_a a
  JOIN tab_b b on b.id=a.tab_b_id
  JOIN tab_c c on c.id=b.tab_c_id
WITH READ ONLY

view-definition-v2.sql文件中的SQL有点像

CREATE OR REPLACE VIEW view_tab_abc
(
  col_a
, col_b
, col_c
, CREATED_AT
, UPDATED_AT
) AS
SELECT a.id         AS col_a
     , a.tab_b_id   AS col_b
     , a.tab_c_id   AS col_c
     , a.created_at AS CREATED_AT
     , a.updated_at AS UPDATED_AT
  FROM tab_a a
WITH READ ONLY

我已经尝试tableName="table_a"tableName="TABLE_A"了,但它仍然没有工作。我还有其他一些不能显示此问题的变更集。有人有任何线索吗?

二手Liquibase版本为3.4.2,数据库为Oracle 12cR1 StandardEdition1

感谢任何提示和最好的问候, 乙

1 个答案:

答案 0 :(得分:0)

一种可能性是,它没有为您的表寻找正确的架构。尝试改变你的前提条件,得到类似的东西:

<tableExists schemaName="my_schema" tableName="table_a" />

每张支票。

另一件事是,如果您使用updateSQL命令,则使用liquibase参数始终值得保存生成的SQL并运行它。这样您就可以确定您运行的SQL与Liquibase运行的SQL相同。