使用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
相关产品推荐
相关产品推荐

