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

Maven: liquibase - firebird: Reason: liquibase.exception.DatabaseException: GDS Exception. 335544569. Dynamic SQL Error

我可以使用 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 中添加 create table 语句并在 0002.sql.

中添加 Grant 命令时,设置似乎有效

我的 .sql 文件看起来像这样(我的 firebird 配置是安装 2.5.8 后的默认配置):

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;

Liquibase 配置:

<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>

更改日志主文件包含执行的 /scripts 部分

属性 文件:

# 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

更新2:

<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>

和变更日志 1:

<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 文件。

使用 Firebird documentation

中描述的 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;

Another useful documentation link

问题是您的 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 将 SQL 文件明确包含在 XML 中。这需要在 XML 中明确定义更改集并链接关联的 SQL 脚本(而之前的解决方案将在 SQL 文件中将更改集与 SQL 一起定义).