0

我遇到了 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_b并且table_c确实存在......但仍然一直在view-definition-v1.sql执行,我多次检查链接文件中的 SQL 是否有效。如果我直接发出该 SQL,它会毫无怨言地执行。

文件里面的SQLview-definition-v1.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

文件里面的SQLview-definition-v2.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"or tableName="TABLE_A",但它仍然像它根本不起作用。我还有其他几个没有显示此问题的变更集。有人有任何线索吗?

使用的 Liquibase 版本是 3.4.2,数据库是 Oracle 12cR1 StandardEdition1

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

4

1 回答 1

0

一种可能性是它没有为您的表查找正确的架构。尝试更改您的先决条件以具有以下内容:

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

对于每个检查。

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

于 2016-04-18T15:52:45.177 回答