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

时间:2019-02-01 15:56:43

标签: liquibase

我有一个简单的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时,它可以正常工作-表已创建。如果我再次运行-它运行成功,并且不再尝试重新创建表。

但是当我在具有相同数据库凭据的另一台服务器上运行相同代码时,却出现异常:

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

你能帮忙吗?

Liquibase版本:3.5.7

数据库:Microsoft SQL Server 2016

关于Stackoverflow的类似问题有点不同,不是我的情况。

2 个答案:

答案 0 :(得分:0)

意味着那里已经有名称测试的对象。那里不能有两个同名的对象。

我不知道sqlserver,但也许此选择可以为您提供更多信息:

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

您有两个选择:

  • 将表从测试重命名为其他名称
  • 删除/重命名目标数据库中的测试对象

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

答案 1 :(得分:0)

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