PostgreSQL外部表更新触发远程表插入报错求助
PostgreSQL FDW更新外部表时触发函数报错"remote_account_journals不存在"
问题场景
更新本地FDW外部表accounts时触发以下错误:
new_database=# UPDATE accounts SET name = 'valou' WHERE id = 1; ERROR: relation "remote_account_journals" does not exist CONTEXT: PL/pgSQL function public.fill_remote_account_journals() line 8 at SQL statement remote SQL command: UPDATE public.remote_accounts SET name = $2 WHERE ctid = $1 RETURNING id, name, ...
背景信息:
- 远程库的
remote_accounts表自带触发器,触发后调用fill_remote_account_journals()向remote_account_journals插入数据 - 本地已创建对应外部表
accounts和account_journals,并在本地accounts表上创建了同名触发器及fill_account_journals()函数
解决思路
验证远程端的表与权限
确认远程数据库publicschema下确实存在remote_account_journals表,且FDW连接使用的远程数据库账号拥有该表的插入权限。错误来自远程函数,说明是远程侧找不到表,而非本地外部表配置问题。修正远程函数的表引用
检查远程函数fill_remote_account_journals()中对目标表的引用,确保使用全限定表名(public.remote_account_journals),避免因远程会话的search_path未包含public导致表找不到。排查重复触发问题
本地和远程同时配置了触发器,会导致一次更新操作触发两次逻辑:本地触发器操作外部表(本质是远程表),远程触发器也会在远程更新时触发。如果远程触发器已经完成向remote_account_journals插入数据的逻辑,可考虑禁用本地触发器,避免重复操作与冲突。检查远程会话的search_path
登录远程数据库,执行SHOW search_path;确认会话默认搜索路径包含public。如果不包含,可修改远程函数所在角色的search_path,或在函数中显式指定schema。
内容的提问来源于stack exchange,提问作者Valentin Leguy
相关产品推荐
相关产品推荐

