postgresql - 外部数据包装器远程触发器找不到远程表

标签 postgresql triggers sql-insert postgresql-9.3 foreign-data-wrapper

远程模式:

some_table
some_table_view
some_table_view_trigger (INSTEAD OF INSERT)
    -- tries to access some_table (select/update/insert)

本地模式:

some_table_view_fdw
    -- wraps some_table_view on remote

现在在本地,当我在 some_table_view_fdw 上运行 INSERT 时,我得到 relation not found: some_table

  • 我可以从 some_table_view_fdw 中进行选择(some_table_view 只是从 some_table 返回 *)。
  • insert into some_table_view 如果在本地(远程)运行,效果很好。触发器执行它应该执行的操作。
  • 请注意 some_table_view_fdw 不直接引用 some_table,所以我猜触发器一定正在运行但由于某种原因找不到它自己的表?

我正在使用 postgres 9.3

最佳答案

问题源于在查询远程服务器时 search_path 参数设置为 pg_catalog。因此,不会自动解析对架构 public 中表的引用。

要解决此问题,请在触发器函数中使用绝对表名,例如public.my_table 而不是 my_table。这也适用于触发器或 View 中使用的所有函数和 View 。

您还可以在触发器函数中设置 search_path,但我不推荐这种解决方案。当触发器在本地触发时,悄悄更改的参数将一直有效,直到 session 结束,这可能会导致进一步的困惑。


作为一个好奇心:如何使用 postgres_fdw 检查远程服务器上的 search_path

在远程服务器(本地)上使用触发器创建测试表:

create table test_path (id int, val text);

create or replace function path_trigger()
returns trigger language plpgsql as $$
begin
    select setting into new.val
    from pg_settings where name = 'search_path';
    return new;
end $$;

create trigger path_trigger
before insert on test_path
for each row execute procedure path_trigger();

insert into test_path (id) values (1) returning *;

 id |      val     
----+----------------
  1 | "$user",public
(1 row)

在本地服务器上创建外部表并触发远程触发器:

create foreign table test_path (id int, val text)
server backup_server
options (schema_name 'public', table_name 'test_path'); 

insert into test_path (id) values (2) returning *;

 id |    val     
----+------------
  2 | pg_catalog
(1 row) 

关于postgresql - 外部数据包装器远程触发器找不到远程表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32937463/

相关文章:

mysql - hibernate 不插入行

postgresql - JSONB 索引是否比原生索引慢?

sql - 必须出现在postgresql的GROUP BY子句中

sql - 在 PostgreSQL 中将重叠的间隔分割成较小的、接触的间隔

mysql - 当表更新时从 MySQL 触发器发送电子邮件

SQL Server 2008 MERGE 语句 - 如何禁用 INSTEAD OF INSERT 触发器以允许 MERGE

c# - WPF 根据内容将标签背景设置为图像

ruby-on-rails - 是否可以在 rails 中有多个数据库连接池进行切换?

mysql - 对于我在特定表中尝试的每个 INSERT 查询,键 'PRIMARY' 的重复条目

mysql - SQL从不同数据库的多个表插入数据