我可以使用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
文件。
答案 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)
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;