我有一个简单的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的类似问题有点不同,不是我的情况。
答案 0 :(得分:0)
意味着那里已经有名称测试的对象。那里不能有两个同名的对象。
我不知道sqlserver,但也许此选择可以为您提供更多信息:
select * from sys.all_objects where lower(name) = 'test'
您有两个选择:
编辑:如果它与之前创建的对象相同,则显示用于本地设置和目标数据库设置的liquibase命令。
答案 1 :(得分:0)
我找到了原因:relativeToChangelogFile="true"
导致了此问题。 Liquibase检查changeSet名称和文件名是否应用了changeSet。对于relativeToChangelogFile="true"
,项目文件夹的不同位置的文件名是不同的,这就是为什么一个changeSet在不同环境下被视为两个不同的原因。