我正在为MySQL数据库设置第一个liquibase maven项目。已做好创建触发器的工作。
我相信这是liquibase和JDBC无法正确处理多语句SQL的问题,但我无法弄清缺少的内容。
这是我的pom依赖
<dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-parent</artifactId> <version>3.5.3</version> <type>pom</type> </dependency> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>3.6.3</version> </dependency>
这是我的liquibase包含文件
<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.0.xsd"> <changeSet id="event_horizon_1_0_0" author="lmtyler" dbms="mysql"> <sql> drop trigger if exists ai_event_approval; </sql> </changeSet> <changeSet id="event_horizon_1_0_1" author="lmtyler" dbms="mysql"> <sqlFile splitStatements="false" stripComments="false" endDelimiter="DONE" path="01__ai_event_approval.sql" relativeToChangelogFile="true" /> </changeSet> </databaseChangeLog>
这是我的SQL文件
CREATE DEFINER ='evclient'@'%' TRIGGER ai_event_approval AFTER INSERT ON event_approval FOR EACH row begin insert into event_approval_log (rowAction, actionTs, event, requestorEmail, requestReason, statusType, approverUserId, approverReason, lastChangTs) values ('I', current_timestamp(6), new.event, new.requestorEmail, new.requestReason, new.statusType, new.approverUserId, new.approverReason, new.lastChangTs); end; # DONE
我期望通过设置splitStatements,stripComments和endDelimiter,我将获得liquibase来将整个SQL作为一个JDBC发送。
但是我收到这个错误
[ERROR] Failed to execute goal org.liquibase:liquibase-maven-plugin:3.6.3:update (default) on project event-horizon-mysql: Error setting up or running Liquibase: Migration failed for change set /Users/lmtyler/OneDrive - Walmart Inc/workspace/code/event-horizon/event-horizon-mysql/src/main/java/resources/liquibase/schema/triggers/02__au_event_approval.sql::event_horizon_1_0_1::lmtyler: [ERROR] Reason: liquibase.exception.DatabaseException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 23 [Failed SQL: CREATE TRIGGER au_event_approval [ERROR] AFTER UPDATE [ERROR] ON event_approval [ERROR] FOR EACH row [ERROR] begin [ERROR] insert into event_approval_log (rowAction, [ERROR] actionTs, [ERROR] event, [ERROR] requestorEmail, [ERROR] requestReason, [ERROR] statusType, [ERROR] approverUserId, [ERROR] approverReason, [ERROR] lastChangTs) [ERROR] values ('U', [ERROR] current_timestamp(6), [ERROR] new.event, [ERROR] new.requestorEmail, [ERROR] new.requestReason, [ERROR] new.statusType, [ERROR] new.approverUserId, [ERROR] new.approverReason, [ERROR] new.lastChangTs)]
一夜无眠,再加上@Jens建议,我终于明白了这个问题。
首先,如果您看到我的帖子,则该错误不是我所认为的SQL错误。我以为AFTER INSERT是引发错误的原因,但这是AFTER UPDATE
AFTER INSERT
AFTER UPDATE
关键是确保设置splitStatements:false,endDelimiter而无需设置。
splitStatements:false
endDelimiter
这是两个有效的示例:
<changeSet id="event_horizon_1_0_1" author="lmtyler" dbms="mysql"> <sqlFile splitStatements="false" stripComments="false" path="01__ai_event_approval.sql" relativeToChangelogFile="true"/> </changeSet>
与此SQL文件
CREATE DEFINER ='evclient'@'%' TRIGGER ai_event_approval AFTER INSERT ON event_approval FOR EACH row begin insert into event_approval_log (rowAction, actionTs, event, requestorEmail, requestReason, statusType, approverUserId, approverReason, lastChangTs) values ('I', current_timestamp(6), new.event, new.requestorEmail, new.requestReason, new.statusType, new.approverUserId, new.approverReason, new.lastChangTs); end;
这是使用SQL格式
--changeset lmtyler:event_horizon_1_0_1 dbms:mysql splitStatements:false CREATE TRIGGER au_event_approval AFTER UPDATE ON event_approval FOR EACH row begin insert into event_approval_log (rowAction, actionTs, event, requestorEmail, requestReason, statusType, approverUserId, approverReason, lastChangTs) values ('U', current_timestamp(6), new.event, new.requestorEmail, new.requestReason, new.statusType, new.approverUserId, new.approverReason, new.lastChangTs); end;