【问题标题】:postgres foreign data wrapper remote trigger cannot find a remote tablepostgres 外部数据包装器远程触发器找不到远程表
【发布时间】:2015-10-04 19:24:48
【问题描述】:

远程架构:

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 返回 *)。
  • 如果在本地(远程)运行,插入 some_table_view 就可以正常工作。触发器会做它应该做的事情。
  • 请注意 some_table_view_fdw 没有直接引用 some_table,所以我猜触发器必须正在运行,但由于某种原因找不到它自己的表?

我正在使用 postgres 9.3

【问题讨论】:

    标签: postgresql sql-insert foreign-data-wrapper


    【解决方案1】:

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

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

    你也可以在触发函数中设置search_path,虽然我不推荐这个解决方案。当触发器在本地触发时,悄悄更改的参数将一直有效,直到会话结束,这可能会导致进一步的混乱。


    将其视为好奇心:如何使用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) 
    

    【讨论】:

    • 在分区(创建继承 public.table 的表)时使用的远程触发函数有问题。这解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 2010-12-12
    • 2021-03-04
    • 2016-12-09
    相关资源
    最近更新 更多