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
文件。
中描述的 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;
问题是您的 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 一起定义).
我可以使用 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
文件。
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;
问题是您的 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 一起定义).