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

使用pgsql-http调用存储过程,触发器无法写入值

解决PostgreSQL触发器无法更新字段的问题

核心问题:触发器类型错误

你当前使用的是AFTER INSERT触发器,这类触发器在数据已经插入到表中之后才执行。此时修改NEW变量的字段值,不会同步到已经插入的行里,这就是amadeus_evaluation_code和amadeus_status_code始终为空的直接原因。

次要问题:冗余的临时表操作

触发器函数里创建临时表存储教师信息完全没必要,可以直接通过关联查询获取所需字段,简化逻辑。

修复后的代码

1. 优化触发器函数(移除临时表)

CREATE OR REPLACE FUNCTION falko_organizer.trigger_get_json_amadeus_codes()
    RETURNS TRIGGER AS
$$
DECLARE 
    result json;
    v_email TEXT;
    v_first_name TEXT;
    v_last_name TEXT;
BEGIN
    -- 直接从teachers表获取教师信息,无需临时表
    SELECT t.email, t.first_name, t.last_name
    INTO v_email, v_first_name, v_last_name
    FROM falko_organizer.teachers t
    WHERE t.teacher_id = NEW.teacher_id;

    -- 调用API获取JSON结果
    SELECT falko_organizer.get_json_amadeus_codes(
        NEW.code,
        v_email,
        v_first_name,
        v_last_name
    ) INTO result;

    -- 为待插入的行赋值
    NEW.amadeus_evaluation_code := result->>'evaluation_id';
    NEW.amadeus_status_code := result->>'status_code';

    RETURN NEW;
END
$$
LANGUAGE plpgsql;

2. 修改触发器为BEFORE INSERT类型

-- 先删除原有触发器
DROP TRIGGER IF EXISTS insert_amadeus_codes ON falko_organizer.evaluations;

-- 创建BEFORE INSERT触发器,确保插入前完成字段赋值
CREATE TRIGGER insert_amadeus_codes
    BEFORE INSERT ON falko_organizer.evaluations
    FOR EACH ROW
EXECUTE FUNCTION falko_organizer.trigger_get_json_amadeus_codes();

验证说明

修改后,插入新的evaluation数据时,触发器会在数据写入表之前执行,此时修改NEW的字段值会直接带入插入操作,最终表中就能正确存储API返回的evaluation_id和status_code。

原get_json_amadeus_codes函数逻辑正常,无需修改,直接调用能返回正确结果说明API调用环节没有问题。

内容的提问来源于stack exchange,提问作者Stefan Boehringer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:07:30