Liquibase配置PostgreSQL插入触发器时迁移执行失败
错误原因
你的变更集存在3个核心问题,直接导致执行失败:
- 语句顺序颠倒:PostgreSQL要求创建触发器时,被引用的触发器函数必须提前存在。当前代码先执行
CREATE TRIGGER调用customer_update(),之后才编写创建函数的逻辑,执行触发器创建语句时找不到对应函数会直接报错。 - 函数定义语法残缺:触发器函数用
$example_table$作为自定义字符串分隔符开头,但函数结尾没有补上对应的$example_table$做闭合标记,也没有声明函数使用的plpgsql语言,不符合PostgreSQL函数创建的语法要求。 - Liquibase语句拆分冲突:Liquibase默认会按分号把整段SQL拆成独立语句逐段执行,函数体内部的分号会被误判为语句结束标记,把完整的函数逻辑拆成多段无效SQL运行。
修正后的可用变更集
将原变更集替换为以下内容即可正常执行:
<changeSet author="newUser" id="03"> <sql splitStatements="false"> -- 优先创建触发器函数 CREATE OR REPLACE FUNCTION customer_update() RETURNS trigger AS $example_table$ BEGIN INSERT INTO update_customer(id,time) VALUES (NEW.id , current_timestamp); RETURN NEW; END; $example_table$ LANGUAGE plpgsql; -- 函数创建完成后再绑定触发器 CREATE TRIGGER customer_trigger AFTER INSERT ON customer FOR EACH ROW EXECUTE PROCEDURE customer_update(); </sql> </changeSet>
注:
<sql>标签上的splitStatements="false"作用是告知Liquibase不要自动拆分这段SQL,将整段内容完整发给PostgreSQL执行,避免把函数体拆成无效片段。
内容的提问来源于stack exchange,提问作者Thejus32
相关产品推荐
相关产品推荐

