Maven: liquibase - firebird: Причина: liquibase.exception.DatabaseException: GDS Exception. 335544569. Динамическая ошибка SQL - PullRequest
0 голосов
/ 28 августа 2018

Я могу использовать mvn liquibase:update для выполнения запросов .sql к моей базе данных Firebird.

Это работает:

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 и команду Grant в 0002.sql.

Мой файл .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;

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>

Мастер изменений содержит раздел / скрипты, которые выполняются

файл свойств:

# 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 голосов
/ 28 августа 2018

Проблема в том, что ваши файлы SQL не соответствуют требованиям для файлов изменений SQL Liquibase , в результате они просто отправляются без изменений или интерпретации (т. Е. Разделения отдельных операторов). 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. Этот анализ включает в себя разбиение операторов для отдельного выполнения (если не переопределено с помощью явные атрибуты).

В качестве альтернативы, вы также можете явно включить ваши файлы SQL в XML, используя sqlFile. Это требует явного определения набора изменений в XML и связывания связанного сценария SQL (тогда как предыдущее решение определит набор изменений вместе с SQL в файле SQL).

0 голосов
/ 28 августа 2018

Использовать определение GRANT, описанное в Документация Firebird

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;

Другая полезная ссылка на документацию

...