我遇到了一个 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_a
,table_b
和table_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 相同。