You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:06:32