我正在为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)]
答案 0 :(得分:0)
一个晚上的睡眠以及@Jens的建议,我终于明白了。
首先,如果您看到我的帖子,则错误不是我所认为的SQL。
我以为是引发错误的AFTER INSERT
,但是是AFTER UPDATE
关键是要确保设置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;
答案 1 :(得分:0)
我在 sql 标签内执行触发器时遇到了同样的问题。如果您在 liquibase 中执行代码块,请不要忘记将 splitStatements:false 添加到您的 sql 标记中。
<changeSet id="your_id" author="your_name">
<comment>your comments</comment>
<sql splitStatements="false">
CREATE TRIGGER trigger_name
BEFORE UPDATE ON table_name FOR EACH ROW
BEGIN
--Your Code Block
END;
</sql>
</changeSet>