首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >液化"splitStatements“有什么好处?

液化"splitStatements“有什么好处?
EN

Stack Overflow用户
提问于 2022-07-15 06:23:09
回答 1查看 319关注 0票数 3

正在使用的液化基版本-core.液化基:液化基-核心:3.8.2。(非专业版)

Liquibase文档(1 & 2)描述了splitStatements (默认为true)

设为false,使Liquibase拆分语句不对;'s和GO's。如果没有设置,默认为true。

当其设置为false时,移除Liquibase拆分语句;s和GO's。默认值为: true。

我发现的另一个有用的帖子- 在Liquibase中,在拆分语句上有一个空行可以吗?

我理解--当splitStatements是真的时,液化基会在;GO上拆分语句。

  1. 还不完全清楚splitStatements增加了什么好处--例如,如果; (结束分隔符)上拆分了SQL语句,它会产生什么不同--例如,如果语句是在一个查询或多个查询中执行的--数据库无论如何不会处理基于";“的内容。这似乎是至关重要的理解。--有人能举个例子吗?
  2. 我目前的项目有splitStatements:false。禁用splitStatements会带来什么好处?最好以-any为例。

------------------------question在回答@ answer 13579后展开

下面是从一个液化基变更文件中提取出来的内容。这就是我提出这个问题的原因。它在脚本中有splitStatements:false;,并且工作正常。对于splitStatements:false,我希望在这种情况下会出现一个错误,而我认为答案也会在本例中提出一个错误。下面是生产代码,所以我不知道它是如何工作的,后端是POSTGREs。谁能解释一下。

代码语言:javascript
复制
--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
);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-16 14:58:43

数据库引擎通常不会自行拆分语句。在使用、MySQL工作台等SQL编辑器时,您可能会有不同的印象。它们拆分脚本并向数据库引擎发送单独的SQL语句,例如使用JDBC。这是自动发生的,因此您可能会认为数据库可以做到这一点。

如果splitStatements =true,这将失败:

代码语言:javascript
复制
<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,它将失败:

代码语言:javascript
复制
<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“这是一条语句,不要试图拆分它”。例如,在创建存储过程时。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72989797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档