正在使用的液化基版本-core.液化基:液化基-核心:3.8.2。(非专业版)
Liquibase文档(1 & 2)描述了splitStatements (默认为true)
设为false,使Liquibase拆分语句不对;'s和GO's。如果没有设置,默认为true。
和
当其设置为false时,移除Liquibase拆分语句;s和GO's。默认值为: true。
我发现的另一个有用的帖子- 在Liquibase中,在拆分语句上有一个空行可以吗?
我理解--当splitStatements是真的时,液化基会在;和GO上拆分语句。
splitStatements增加了什么好处--例如,如果; (结束分隔符)上拆分了SQL语句,它会产生什么不同--例如,如果语句是在一个查询或多个查询中执行的--数据库无论如何不会处理基于";“的内容。这似乎是至关重要的理解。--有人能举个例子吗?splitStatements:false。禁用splitStatements会带来什么好处?最好以-any为例。------------------------question在回答@ answer 13579后展开
下面是从一个液化基变更文件中提取出来的内容。这就是我提出这个问题的原因。它在脚本中有splitStatements:false和;,并且工作正常。对于splitStatements:false,我希望在这种情况下会出现一个错误,而我认为答案也会在本例中提出一个错误。下面是生产代码,所以我不知道它是如何工作的,后端是POSTGREs。谁能解释一下。
--liquibase formatted sql
--changeset adam:001-users-001 failOnError:true splitStatements:false logicalFilePath:001-users.sql
CREATE TABLE sys_users
(
user_id SERIAL,
first_name character varying(64) NOT NULL,
last_name character varying(64) NOT NULL,
email character varying(255) NOT NULL
)
WITH (
OIDS=FALSE
);
CREATE TABLE user_role
(
role_id SERIAL,
role_name character varying(255) NOT NULL,
description character varying(255) NOT NULL,
created_on timestamp(6) with time zone NOT NULL,
created_by character varying(64) NOT NULL,
)
WITH (
OIDS=FALSE
);发布于 2022-07-16 14:58:43
数据库引擎通常不会自行拆分语句。在使用、MySQL工作台等SQL编辑器时,您可能会有不同的印象。它们拆分脚本并向数据库引擎发送单独的SQL语句,例如使用JDBC。这是自动发生的,因此您可能会认为数据库可以做到这一点。
如果splitStatements =true,这将失败:
<changeSet id="it fails" author="DBA presents">
<sql splitStatements="true">
create procedure some_proc (out title int)
begin
select count(1) into title from titles
where emp_no = 123;
end
</sql>
</changeSet>当遇到分号时,Liquibase将尝试拆分语句,这显然是一个错误,因为分号是更大语句的一部分(创建过程)。将splitStatement更改为false以允许Liquibase SQL标记中的分号。
另一方面,在大多数情况下将splitStatements设置为true是有用的。例如,当您希望在单个SQL标记中提供多个语句时。对于splitStatement=false,它将失败:
<changeSet id="it works" author="DBA presents">
<sql splitStatements="false">
update titles
set title = 'abc'
where emp_no = 123;
update titles
set title = 'abc'
where emp_no = 234;
</sql>
</changeSet>您的PostgreSQL示例
我的计算机上没有安装Postgres,但是相同的脚本(在明显的语法更改之后)由于MySQL的splitStatements=false而失败。这无疑是数据库引擎之间的许多不同之一--显然Postgres将脚本拆分为语句本身。也许对于Postgres,splitStatement属性没有意义,但是对于其他引擎,它喜欢MySQL。Liquibase支持各种引擎,所以并不是所有的选项都是必需的。
对的总结
通常,使用默认(splitStatements=true),您将不必为每个语句创建单独的SQL标记。但有时您可能希望通过设置splitStatements=false来显式地告诉Liquibase“这是一条语句,不要试图拆分它”。例如,在创建存储过程时。
https://stackoverflow.com/questions/72989797
复制相似问题