【问题标题】:Flyway DB2 change delimiter NOT WORKINGFlyway DB2 更改分隔符不起作用
【发布时间】:2015-09-03 00:42:09
【问题描述】:

我们使用 Flyway 作为数据库迁移工具。 现在我们想用它在我们的数据库上执行一些导入语句。

数据中有一些包含“;”的存储过程和命令字符。

所以我们想更改 sql 脚本中的分隔符。

在 IBM Data Studio 中,我通过以下 sql 代码实现了这一点:

--#SET TERMINATOR @

insert into "CONTROL"."AP18_ADMIN_RIGHTS" ("REG_ID", "USERNAME") values(12,'testuser')@

--#SET TERMINATOR ;

但是当我尝试使用 flyway 执行此代码时,我收到以下错误消息:

 [ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:3.0:migrate (default-cli) on project healthstat-database: org.flywaydb.core.internal.dbsupport.FlywaySqlScriptException: Error executing statement at line 3: insert into "CONTROL"."AP18_ADMIN_RIGHTS" ("REG_ID", "USERNAME") values(6,'testuser')@
 [ERROR] insert into "CONTROL"."AP18_ADMIN_RIGHTS" ("REG_ID", "USERNAME") values(9,'testuser')@
 [ERROR] insert into "CONTROL"."AP18_ADMIN_RIGHTS" ("REG_ID", "USERNAME") values(10,'testuser')@
 [ERROR]
 [ERROR] --#SET TERMINATOR: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601,SQLERRMC=(6,'testuser')@
 [ERROR] insert into;, "USERNAME") values;<space>, DRIVER=3.64.82

是否可以更改sql文件中的分隔符?

【问题讨论】:

    标签: maven db2 flyway


    【解决方案1】:

    没有可以在 DB2 中执行的 SQL 语句来设置语句分隔符。

    语法--#SET TERMINATOR x 特定于DB2 命令行处理器,Data Studio 实现了它(大概)是为了兼容。

    看来必须修改 Flyway 以支持 DB2 的不同语句终止符。

    【讨论】:

      【解决方案2】:

      我已经覆盖了类 org.flywaydb.core.internal.dbsupport.db2.DB2SqlStatementBuilder 部分来自 MySQLSqlStatementBuilder 的代码:

      package org.flywaydb.core.internal.dbsupport.db2;
      import org.flywaydb.core.internal.dbsupport.Delimiter;
      import org.flywaydb.core.internal.dbsupport.SqlStatementBuilder;
      
      public class DB2SqlStatementBuilder extends SqlStatementBuilder {
      
      private static final String DELIMITER_KEYWORD = "--#SET TERMINATOR";
      
      public DB2SqlStatementBuilder() {
      }
      
      @Override
      public Delimiter extractNewDelimiterFromLine( String line ) {
          if( line.toUpperCase().startsWith( DELIMITER_KEYWORD ) ) {
              return new Delimiter(
                      line.substring( DELIMITER_KEYWORD.length() ).trim(),
                      false );
          }
      
          return null;
      }
      
      @Override
      protected Delimiter changeDelimiterIfNecessary( String line,
              Delimiter delimiter ) {
          if( line.toUpperCase().startsWith( DELIMITER_KEYWORD ) ) {
              return new Delimiter(
                      line.substring( DELIMITER_KEYWORD.length() ).trim(),
                      false );
          }
      
          return delimiter;
      }
      
      @Override
      protected boolean isSingleLineComment( String line ) {
          return line.startsWith( "--" ) && !line.startsWith( DELIMITER_KEYWORD);
      }
      

      所以我可以在我的 SQL 源代码中使用 DB2 分隔符。在 Web 应用程序中,您应该将此类放在 web/classes 中,以便在将 flyway.jar 放入 web/lib 之前加载它,因为 http://download.oracle.com/otn-pub/jcp/servlet-2.4-fr-spec-oth-JSpec/servlet-2_4-fr-spec.pdf

      PS:我创建问题 https://github.com/flyway/flyway/issues/1163 投票(如果有的话)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 2016-08-03
        相关资源
        最近更新 更多