Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Liquibase是否支持干运行?_Sql_Transactions_Liquibase - Fatal编程技术网

Sql Liquibase是否支持干运行?

Sql Liquibase是否支持干运行?,sql,transactions,liquibase,Sql,Transactions,Liquibase,我们有两个数据模式,我们研究了到Liquibase的迁移。(其中一个数据模式已迁移到Liquibase) 对于我们来说,重要的问题是Liquibase是否支持干运行: 我们需要在不提交的情况下对所有模式运行数据库更改,以确保不会出现问题 如果成功,所有数据库更改将使用提交再次运行 (与此类似但与液化有关的问题) 在答案后添加 我阅读了与updateSQL相关的文档,但它并没有满足“干运行”的要求。 它只生成SQL(在命令行、Ant任务和Maven插件中)。 我会澄清我的问题: Liquiba

我们有两个数据模式,我们研究了到Liquibase的迁移。(其中一个数据模式已迁移到Liquibase)

对于我们来说,重要的问题是Liquibase是否支持干运行:

  • 我们需要在不提交的情况下对所有模式运行数据库更改,以确保不会出现问题
  • 如果成功,所有数据库更改将使用提交再次运行
(与此类似但与液化有关的问题)

在答案后添加

我阅读了与updateSQL相关的文档,但它并没有满足“干运行”的要求。 它只生成SQL(在命令行、Ant任务和Maven插件中)。 我会澄清我的问题:

Liquibase是否支持事务控制

我希望在执行Liquibase changelog之前打开事务,并在执行changelog之后回滚事务。 当然,我需要验证执行的结果

可能吗

已添加

如果不控制事务(或干运行),我们就无法迁移以分解所有模式

请帮助。

您可以尝试“updateSQL”模式,它将连接db(检查您的访问权限),获取db锁,生成/打印要应用的SQL语句(基于db状态和您当前的liquibase更改集),还将打印db当前状态下缺少的chageset id并释放db锁

不幸的是,没有

默认情况下,Liquibase提交事务,执行变更集的所有语句。我假设您心目中的迁移路径通常涉及多个变更集

修改事务行为的唯一方法是
标记的
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