回滚在 liquibase 变更集中不起作用
Rollback is not working in liquibase changeset
我使用这些脚本进行回滚测试。但是我的数据库没有任何反应,回滚不起作用。它仍然进行插入。请帮助我!
<changeSet author="me" id="123123">
<sql>
INSERT INTO employee (id, name) VALUES ('adad', 'test')
</sql>
<rollback/>
</changeSet>
在使用 liquibase 脚本时理解回滚的概念很重要,因为这可能会被滥用。
Liquibase 迁移的类别
有两类 Liquibase 操作,导致生成不同的回滚语句:
自动,其中迁移可以确定性地生成回滚所需的步骤
手动,我们需要发出回滚命令,因为迁移指令不能用于确定性地识别语句
例如,“create table
”语句回滚到“drop
”创建的 table。这一点可以确定无疑,因此可以自动生成回滚语句。
另一方面,无法确定“drop table
”命令的回滚语句。无法确定 table 的最后状态,因此无法自动生成回滚语句。这些类型的迁移语句需要手动回滚指令。
这是上述陈述的一个例子
<changeSet id="testRollback" author="Whosebug">
<createTable tableName="Whosebug_turorial">
<column name="id" type="int"/>
<column name="heading" type="varchar(36)"/>
<column name="author" type="varchar(36)"/>
</createTable>
<rollback>
<dropTable tableName="Whosebug_test"/>
</rollback>
</changeSet>
所以在你的情况下回滚不能保持为空,应该给出一些声明。
Let's correct your code.
<changeSet author="me" id="123123">
<sql>INSERT INTO EMPLOYEE (id, name) VALUES ('adad', 'test')</sql>
<rollback>DELETE FROM EMPLOYEE WHERE ID = 'adad'</rollback>
</changeSet>
我们可以 运行 使用命令进行迁移:
mvn liquibase:update
执行后我们可以回滚操作:
mvn liquibase:rollback
这会执行变更集的回滚段,并且应该恢复在更新阶段完成的任务。但是如果我们单独发出这个命令,构建就会失败。
原因是——我们没有指定回滚的限制;通过回滚到初始阶段,数据库将被完全清除。因此必须定义以下三个约束之一来限制满足条件时的回滚操作:
- rollbackTag
- rollbackCount
回滚日期
回滚到标记
我们可以将数据库的特定状态定义为标签。因此,我们可以参考那个状态。回滚到标签名称“1.0”看起来像:
mvn liquibase:rollback -Dliquibase.rollbackTag=1.0
这将执行标签“1.0”之后执行的所有变更集的回滚语句。
按计数回滚
在这里,我们定义需要回滚多少个变更集。如果我们定义为一个,最后执行的变更集将被回滚:
mvn liquibase:rollback -Dliquibase.rollbackCount=1
回滚到日期
我们可以将回滚目标设置为日期,因此,在该日期之后执行的任何变更集都将回滚:
mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"
日期格式必须是 ISO 数据格式或应匹配执行平台的 DateFormat.getDateInstance() 的值。
您也可以在不同的 sql 文件中提及 sql 并可以在此处提供参考。
我使用这些脚本进行回滚测试。但是我的数据库没有任何反应,回滚不起作用。它仍然进行插入。请帮助我!
<changeSet author="me" id="123123">
<sql>
INSERT INTO employee (id, name) VALUES ('adad', 'test')
</sql>
<rollback/>
</changeSet>
在使用 liquibase 脚本时理解回滚的概念很重要,因为这可能会被滥用。
Liquibase 迁移的类别
有两类 Liquibase 操作,导致生成不同的回滚语句:
自动,其中迁移可以确定性地生成回滚所需的步骤
手动,我们需要发出回滚命令,因为迁移指令不能用于确定性地识别语句
例如,“create table
”语句回滚到“drop
”创建的 table。这一点可以确定无疑,因此可以自动生成回滚语句。
另一方面,无法确定“drop table
”命令的回滚语句。无法确定 table 的最后状态,因此无法自动生成回滚语句。这些类型的迁移语句需要手动回滚指令。
这是上述陈述的一个例子
<changeSet id="testRollback" author="Whosebug">
<createTable tableName="Whosebug_turorial">
<column name="id" type="int"/>
<column name="heading" type="varchar(36)"/>
<column name="author" type="varchar(36)"/>
</createTable>
<rollback>
<dropTable tableName="Whosebug_test"/>
</rollback>
</changeSet>
所以在你的情况下回滚不能保持为空,应该给出一些声明。
Let's correct your code.
<changeSet author="me" id="123123">
<sql>INSERT INTO EMPLOYEE (id, name) VALUES ('adad', 'test')</sql>
<rollback>DELETE FROM EMPLOYEE WHERE ID = 'adad'</rollback>
</changeSet>
我们可以 运行 使用命令进行迁移:
mvn liquibase:update
执行后我们可以回滚操作:
mvn liquibase:rollback
这会执行变更集的回滚段,并且应该恢复在更新阶段完成的任务。但是如果我们单独发出这个命令,构建就会失败。
原因是——我们没有指定回滚的限制;通过回滚到初始阶段,数据库将被完全清除。因此必须定义以下三个约束之一来限制满足条件时的回滚操作:
- rollbackTag
- rollbackCount
回滚日期
回滚到标记
我们可以将数据库的特定状态定义为标签。因此,我们可以参考那个状态。回滚到标签名称“1.0”看起来像:
mvn liquibase:rollback -Dliquibase.rollbackTag=1.0
这将执行标签“1.0”之后执行的所有变更集的回滚语句。
按计数回滚
在这里,我们定义需要回滚多少个变更集。如果我们定义为一个,最后执行的变更集将被回滚:
mvn liquibase:rollback -Dliquibase.rollbackCount=1
回滚到日期
我们可以将回滚目标设置为日期,因此,在该日期之后执行的任何变更集都将回滚:
mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"
日期格式必须是 ISO 数据格式或应匹配执行平台的 DateFormat.getDateInstance() 的值。
您也可以在不同的 sql 文件中提及 sql 并可以在此处提供参考。