【发布时间】:2022-03-11 17:54:25
【问题描述】:
我想使用 liquibase 在 mysql 中创建一个简单的触发器。以下脚本直接在 mysql 中运行:
delimiter $$
CREATE TRIGGER myTrigger
BEFORE INSERT ON myTable FOR EACH ROW
BEGIN
IF(NEW.my_timestamp IS NULL) THEN
SET NEW.my_timestamp = now();
END IF;
END$$
delimiter ;
所以,我想创建一个变更集供 liquibase 使用,它可以使用 update 命令应用此触发器,并在使用 updateSQL 命令时创建一个合适的 sql 脚本。
我在变更集中尝试了各种选项,包括 splitStatements 和 endDelimiter,但只能获得与 update 命令或 updateSQL 命令一起工作的东西。两者都没有。
这是一个使用格式化 sql 的示例更改集,当我使用 update 命令时它可以正常工作,但在我使用 updateSQL 命令时不会创建合适的 sql
-- liquibase formatted sql
-- changeset pcoates33:trigger-1 splitStatements:false
CREATE TRIGGER myTrigger
BEFORE INSERT ON myTable FOR EACH ROW
BEGIN
IF(NEW.my_timestamp IS NULL) THEN
SET NEW.my_timestamp = now();
END IF;
END
-- rollback DROP TRIGGER IF EXISTS myTrigger;
这是我想要的 updateSQL 的工作方式,但更新失败:
-- liquibase formatted sql
-- changeset pcoates33:trigger-1 splitStatements:false
delimiter $$
CREATE TRIGGER myTrigger
BEFORE INSERT ON myTable FOR EACH ROW
BEGIN
IF(NEW.my_timestamp IS NULL) THEN
SET NEW.my_timestamp = now();
END IF;
END$$
delimiter ;
-- rollback DROP TRIGGER IF EXISTS myTrigger;
基本问题是
- mysql 脚本需要分隔符 $$ 和分隔符 ;在里面
- 如果 liquibase 的 jdbc 调用在开头有分隔符 $$,它将失败
【问题讨论】:
-
DELIMITER命令是 CLI 的命令。 liquibase 可能不支持它... -
@Akina 我知道 - 我试图找到一种方法让 liquibase 在运行更新(即 jdbc 调用)时忽略分隔符语句,但在运行 updateSQL 时包含它。据我所知,使用 liquibase 是不可能的。
-
看看stackoverflow.com/a/57113256/10138734——也许会有帮助。