Sql Liquibase是否支持干运行?
我们有两个数据模式,我们研究了到Liquibase的迁移。(其中一个数据模式已迁移到Liquibase) 对于我们来说,重要的问题是Liquibase是否支持干运行:Sql Liquibase是否支持干运行?,sql,transactions,liquibase,Sql,Transactions,Liquibase,我们有两个数据模式,我们研究了到Liquibase的迁移。(其中一个数据模式已迁移到Liquibase) 对于我们来说,重要的问题是Liquibase是否支持干运行: 我们需要在不提交的情况下对所有模式运行数据库更改,以确保不会出现问题 如果成功,所有数据库更改将使用提交再次运行 (与此类似但与液化有关的问题) 在答案后添加 我阅读了与updateSQL相关的文档,但它并没有满足“干运行”的要求。 它只生成SQL(在命令行、Ant任务和Maven插件中)。 我会澄清我的问题: Liquiba
- 我们需要在不提交的情况下对所有模式运行数据库更改,以确保不会出现问题李>
- 如果成功,所有数据库更改将使用提交再次运行
标记的runInTransaction
属性,如下所示。通过将其设置为false
,可以有效地禁用事务管理,即启用自动提交模式,如中所示
我认为这项功能可能是Liquibase值得添加的功能,因此我打开了一个功能请求:。我认为您的答案是“它不支持干运行”,但问题主要在于数据库,而不是Liquibase
Liquibase确实会运行事务中的每个变更集,并在插入到DATABASECHANGELOG表中后将其提交,因此理论上您可以覆盖Liquibase逻辑以回滚该事务,而不是提交该事务,但您将遇到这样的问题:Liquibase运行的大多数SQL都是自动提交的
例如,如果您的变更集为:
<changeSet>
<createTable name="test">
...
</createTable>
</changeSet>
但是,即使您更改了最后一个回滚命令,CREATETABLE调用在运行时也会自动提交,而实际回滚的惟一内容是INSERT
注意:有些数据库将回滚DDL SQL,如postgresql,但大多数数据库不会
INSERT/UPDATE命令将在事务中运行,并可在事务结束时自动回滚,但liquibase没有POST CONDITION命令来执行所需状态的事务内检查。这将是一个有用的特性(),但即使在变更集中有任何自动提交变更标记,它也不可用。如果在上面的示例中添加了创建表的后置条件,后置条件将失败,更新也将失败,但表仍将存在。如果Liquibase迁移与数据库无关,则可以在内存中H2数据库(或其他“一次性数据库”)上运行它您可以使用几行代码轻松地加快速度
var info=新属性();
信息投入(“用户”、“sa”);
输入信息(“密码”);
试试(var con=neworg.h2.Driver().connect(“jdbc:h2:mem:db”,info)){
var accessor=新的FileSystemResourceAccessor();
var jdbc=新的jdbc连接(con);
var database=DatabaseFactory.getInstance().findCorrectDatabaseImplementation(jdbc);
Liquibase Liquibase=new Liquibase(“/path/to/Liquibase.xml”,访问器,数据库);
liquibase.update(“”);
}
.你能澄清一下吗?我已经使用了updatedatabase,它提交了所有内容。我应该如何运行它以防止在干运行时提交?(我使用Ant任务)不确定Ant,但从liquibase CLI->java-jar liquibase-core-2.0.5.jar--url=$DB\u url--username=$DB\u USER--password=$DB\u PASSWDupdateSQL@Michael签出“updateDatabase”ANT任务的“outputFile”属性。描述如下:“将SQL保存到给定文件,而不是执行”@Mark O'Connor,谢谢您的评论,但我如何理解执行是否成功?我应该解析文件吗?要从Ant?@米迦勒读取返回值,也许您应该考虑编写一个直接调用LyQuaseAPI的自定义Ant任务。这将为您提供所需的精细控制。这完全取决于您的DBMS。并非所有DBMS都支持事务性DDL。在Oracle中,这是不可能的(因为您无法回滚
删除表
,或更改表
)。如果您的DBMS支持事务性DDL(例如Postgres),那么一切都将在没有特殊“干运行”模式的情况下工作,因为如果发生错误,Liquibase将回滚不成功的变更集。我们使用Postgres和hsqldb。我不需要一个特殊的“干运行”模式,但是回滚一个不成功的变更集是不够的。我们有3个数据模式,首先需要在所有3个模式上执行回滚(而不是执行数据库更改)。如果在所有3个数据模式上执行成功-我们将使用commit在所有3个模式上运行一个新的执行。如果您将所有内容都放在一个变更集中,您将获得PostgresYes所需的内容,它将起作用。但是最佳实践建议每个变更集有一个变更,我们可能无法使用Liquiba。最佳实践始终取决于需求。若您的需求是在单个事务中进行所有更改,那个么我看不出为什么不将所有内容都放在单个更改集中。除此之外,最好的做法是
START TRANSACTION
CREATE TABLE NAME ...
INSERT INTO DATABASECHANGELOG...
COMMIT