liquibase.exception.DatabaseException: 数据库中已经有一个名为'xxxx'的对象

liquibase.exception.DatabaseException: There is already an object named 'xxxx' in the database

我有一个简单的 createTable changeSet,在 schema.xml 文件中没有像这样的任何额外配置:

<changeSet author="igor" id="create_test">
    <createTable tableName="test">
        <column name="name" type="varchar(100)">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="value" type="varchar(100)"/>
    </createTable>
</changeSet>

schema.xml 文件包含在主 changelog.xml 文件中:

<include relativeToChangelogFile="true" file="init/schema.xml" />

当我 运行 liquibase update 它按预期工作时 - table 已创建。如果我再次 运行 - 它 运行 成功并且 table 不再尝试创建。

但是当我 运行 在具有相同数据库凭据的另一台服务器上使用相同的代码时 - 我得到异常:

liquibase.exception.DatabaseException: There is already an object named 'test' in the database.

你能帮忙吗?

Liquibase 版本:3.5.7

数据库:微软 SQL 服务器 2016

Whosebug 上的类似问题略有不同,我的情况并非如此。

这意味着那里已经存在一些名为 test 的对象。那里不能有两个同名的对象。

我不知道 sqlserver,但也许这个 select 可以为您提供更多信息:

select * from sys.all_objects where lower(name) = 'test'

您有两个选择:

  • 将您的 table 从测试重命名为其他名称
  • remove/rename目标数据库中的测试对象

编辑:如果它是您之前创建的同一对象,请显示您用于本地设置和目标数据库设置的 liquibase 命令。

我找到了原因:relativeToChangelogFile="true" 导致了这个问题。 Liquibase 检查是否通过 changeSet 名称和文件名应用了 changeSet。 relativeToChangelogFile="true" 项目文件夹的不同位置的文件名不同,这就是为什么一个 changeSet 在不同环境中被视为两个不同的原因。