【问题标题】:Liquibase - update native MS SQL scriptLiquibase - 更新本机 MS SQL 脚本
【发布时间】:2017-01-29 11:59:12
【问题描述】:

我正在使用 liquibase 来更新数据库。

我有文件 changelog-master.xml:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.9"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.9
     http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.9.xsd">
          <includeAll path="/src/main/resources/DBChangeLog/DDL/"/>
</databaseChangeLog>

在资源 /src/main/resources/DBChangeLog/DDL/ 我有一个带有脚本 MS SQL 的文件:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
 GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =         OBJECT_ID(N'[dbo].[CONFIG]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[CONFIG](
        [ID] [bigint] NOT NULL,
        [DESCRIPTION] [varchar](255) NOT NULL,
        [OPERATOR] [XML] NOT NULL 
 CONSTRAINT [PK_CONFIG] PRIMARY KEY CLUSTERED 
(
        [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [DATA]
) ON [DATA]
END
GO
SET ANSI_PADDING OFF
GO

当我运行 maven 命令时,我收到错误:mvn liquibase:update

错误:

src\main\resources\DBChangeLog\DDL\V2_20_0_0008__test.sql::raw::includeAll failed.  Error: Incorrect syntax near 'GO'. [Failed SQL: SET ANSI_NULLS ON

GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CONFIG]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[CONFIG](
        [ID] [bigint] NOT NULL,         
        [DESCRIPTION] [varchar](255) NOT NULL,
        [OPERATOR] [XML] NOT NULL
 CONSTRAINT [PK_CONFIG] PRIMARY KEY CLUSTERED
(
        [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [DATA]
) ON [DATA]
END
GO
SET ANSI_PADDING OFF
GO]

是否可以运行典型的 MS SQL 脚本或 liquibase 会出现问题?

【问题讨论】:

  • GO 不是 SQL 语句,因此不能将其放入通过 JDBC 执行的脚本中。

标签: sql-server liquibase


【解决方案1】:

看看这个页面:http://www.liquibase.org/documentation/changes/sql.html 用于 endDelimiter 和 splitStatements 参数。

【讨论】:

  • 问题出在“SET QUOTED_IDENTIFIER ON”“SET ANSI_PADDING ON”上。奇怪的是,我可以在 MS Server Management Studio 上运行这个脚本。
  • JDBC 可能不支持“set”命令,因此 Liquibase 无法执行它。我在 Oracle 数据库的 'set' sqlplus 指令中遇到了这个问题。
猜你喜欢
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2016-12-29
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多