Maven:liquibase-firebird:原因:liquibase.exception.DatabaseException:GDS异常。 335544569.动态SQL错误

时间:2018-08-28 09:15:24

标签: maven firebird liquibase

我可以使用mvn liquibase:update对我的Firebird数据库执行.sql查询。

这有效:

CREATE TABLE xxx (
  xxx
);

但是当我在.sql中执行此命令时,它失败了(X表示长度,我看到这对于MySQL来说太长了,但它是Firebird):

GRANT SELECT ON XXXX_XXXXXX TO XXXXX_XXXX_XXXXX_XXXX;

错误:

[ERROR]      Reason: liquibase.exception.DatabaseException: GDS Exception. 335544569. Dynamic SQL Error
[ERROR] SQL error code = -104
[ERROR] Token unknown - line 8, column 1
[ERROR] GRANT [Failed SQL: CREATE TABLE XXXX_XXXX(

错误中的行是我的GRANT命令的行。当我从脚本中删除该命令时(仅执行CREATE TABLE),它可以工作。我在做什么错了?

手动执行命令。

更新: 看来当我在0001.sql中添加创建表语句并在0002.sql中添加Grant命令时,安装程​​序就可以工作了。

我的.sql文件如下所示(安装2.5.8之后,我的firebird配置为默认设置):

CREATE TABLE TEST_GAMES (
  TEST_GAME_ID INTEGER NOT NULL,
  MONO_ID VARCHAR(255) NOT NULL,
  PERIOD_FROM TIMESTAMP NOT NULL,
  PERIOD_TO TIMESTAMP NOT NULL
);
GRANT SELECT ON TEST_GAMES TO GAME_TEST_GAME_READ;

GAME_TEST_GAME_READ是在数据库设置期间创建的:

CREATE DATABASE 'C:/firebird/TEST_GAME.fdb' USER 'TEST_GAME' PASSWORD 'TEST_GAME';
CONNECT 'C:/firebird/TEST_GAME.fdb' USER 'TEST_GAME' PASSWORD 'TEST_GAME';

CREATE ROLE GAME_TEST_GAME_READ;
CREATE ROLE GAME_TEST_GAME_WRITE;

Liquibaseconfig:

<properties>
    <liquibase.plugin.version>3.5.3</liquibase.plugin.version>
    <firebird.client.version>2.1.6</firebird.client.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

            <configuration>
                <propertyFile>liquibase/liquibase.properties</propertyFile>
                <changeLogFile>liquibase/db-changelog-master.xml</changeLogFile>
            </configuration>

变更日志主文件包含执行的/ script部分

属性文件:

# Firebird
driver=org.firebirdsql.jdbc.FBDriver
url=jdbc:firebirdsql://localhost:3050/C:/firebird/GAME_TEST_GAME.fdb
username=GAME_TEST_GAME
password=GAME_TEST_GAME

Update2:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                        http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
    <include file="liquibase/db-changelog-1.0.xml"/>

</databaseChangeLog>

和changelog1:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                        http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">

    <includeAll path="01-testgame-scripts/" relativeToChangelogFile="true"/>
    <changeSet id="tag-1.0" author="myname">
        <tagDatabase tag="1.0" />
    </changeSet>
</databaseChangeLog>

01-testgame-scripts内,我有.sql文件。

2 个答案:

答案 0 :(得分:1)

问题在于您的SQL文件未遵循Liquibase SQL changelog files的要求,因此它们只是按原样发送而没有任何解析或解释(即,拆分单独的语句)。 Firebird或Jaybird支持一次执行多个语句。

如果将SQL文件更改为

,它将正常工作
--liquibase formatted sql

--changeset mealesbia:1
CREATE TABLE TEST_GAMES (
  TEST_GAME_ID INTEGER NOT NULL,
  MONO_ID VARCHAR(255) NOT NULL,
  PERIOD_FROM TIMESTAMP NOT NULL,
  PERIOD_TO TIMESTAMP NOT NULL
);
GRANT SELECT ON TEST_GAMES TO GAME_TEST_GAME_READ;

--liquibase formatted sql标记将导致Liquibase解析SQL文件并从中创建更改集(用--changeset author:id attribute1:value1 attribute2:value2 [...]标记,这里我使用--changeset mealesbia:1。该分析包括为以下语句拆分语句)单独执行(除非被显式属性覆盖)。

或者,您也可以使用sqlFile在XML中明确包含SQL文件。这需要在XML中显式定义更改集并链接关联的SQL脚本(而以前的解决方案将在SQL文件中将更改集与SQL一起定义。)

答案 1 :(得分:0)

使用Preemptive multitasking

中所述的GRANT定义
GRANT
   {<privileges> ON <object> | role}
   TO <grantees>
   [WITH {GRANT|ADMIN} OPTION]
   [{GRANTED BY | AS} [USER] grantor]

比您的代码看起来像这样:

GRANT SELECT ON TABLE XXXX_XXXXXX TO USER XXXXX_XXXX_XXXXX_XXXX;

Firebird documentation