我怎样才能知道,为什么MARK_RAN了具有前提条件的 Liquibase 迁移而不是执行



我遇到了一个 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

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

一种可能性是它没有为您的表查找正确的架构。尝试更改您的前提条件,使其如下所示:

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

对于每个检查。

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

相关内容

  • 没有找到相关文章

最新更新