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 在不同环境中被视为两个不同的原因。
我有一个简单的 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 在不同环境中被视为两个不同的原因。