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

Heroku Postgres插入/更新操作失败,寻求技术排查协助

问题排查方案:Heroku Connect 触发 hstore 函数不存在错误

针对你遇到的新Salesforce沙箱连接Heroku Postgres时出现的hstore(salesforce.account)函数不存在错误,结合老应用正常的情况,给出以下排查和修复步骤:

1. 检查触发器函数的search_path配置

Heroku Connect自动生成的触发器函数(如salesforce.hc_account_logger)在创建时会继承当前会话的search_path。如果新数据库中该函数的search_path未包含heroku_ext(hstore扩展所在schema),就会导致函数调用失败。

执行以下SQL查询函数的配置:

SELECT proname, proconfig 
FROM pg_proc 
WHERE proname = 'hc_account_logger' AND schemaname = 'salesforce';

如果返回的proconfig中没有search_path = 'salesforce,heroku_ext,public'这类包含heroku_ext的配置,执行以下命令更新函数的search_path:

ALTER FUNCTION salesforce.hc_account_logger() 
SET search_path = salesforce, heroku_ext, public;

2. 显式转换OLD为record类型

错误提示提到需要显式类型转换,因为OLD.*是salesforce.account自定义类型,而默认hstore函数接受的是通用record类型。修改触发器函数中的对应行:

将:

trigger_row.old = hstore(OLD.*) - excluded_cols

改为:

trigger_row.old = hstore(OLD::record) - excluded_cols

注意:Heroku Connect的触发器函数是自动生成的,手动修改后可能会被后续同步覆盖,建议修改后重新同步一次Salesforce对象,或者在重新同步前确保search_path配置正确,让新生成的触发器函数自动包含正确的路径。

3. 验证hstore扩展的完整性

确认heroku_ext schema下的hstore函数是否包含支持record类型的重载:

SELECT proname, proargtypes::regtype[] 
FROM pg_proc 
WHERE proname = 'hstore' AND schemaname = 'heroku_ext';

如果未找到hstore(record)的条目,说明扩展安装不完整,重新安装hstore:

DROP EXTENSION IF EXISTS hstore;
CREATE EXTENSION hstore WITH SCHEMA heroku_ext;

4. 对比新旧数据库的函数差异

将新数据库中salesforce schema下的触发器函数配置,与老应用正常运行的数据库进行对比:

  • 检查函数的search_path是否一致
  • 检查hstore函数的重载列表是否完全相同

如果老数据库中存在针对salesforce.account类型的自定义hstore函数,需要在新数据库中同步创建该重载函数(不过这种情况较少见,更可能是search_path问题)。

5. 重新初始化Heroku Connect同步

如果以上步骤无效,尝试删除新沙箱对应的Heroku Connect同步配置,重新创建同步:

  1. 暂停当前同步
  2. 删除Salesforce对象的同步映射
  3. 重新配置同步并触发全量同步

重新同步时,确保数据库会话的search_path包含heroku_ext,这样新生成的触发器函数会继承正确的路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:28:23