【问题标题】:Postgres fdw inserting record with foreign triggersPostgres fdw 使用外部触发器插入记录
【发布时间】:2020-07-20 03:50:38
【问题描述】:

我已经为第二个 Postgres 数据库建立了一个外部数据包装器并导入了外部模式。现在,当我尝试从我的主数据库向其中一个外部表中插入一行时,它会遇到一个在插入触发器上调用的函数。此触发器正在检查外部表上存在的另一个表,但它说“关系“the_other_table”不存在。我可以从主数据库中选择它,但在执行触发器时它看不到它。

我尝试使用相同名称的两个架构,然后将架构重新导入到不同的名称,但仍然没有。就好像它正在我的主表上执行触发器,但不知道在哪里寻找另一个表。

有什么想法吗?

【问题讨论】:

  • 你能举个例子吗?您是否使用模式名称完全限定表名?
  • 数据库:CONV(我希望编写脚本并将外部模式导入到的位置,以及 INTERIM(我希望插入的原始数据库。我正在尝试插入到INTERIM 从 CONV 执行(我希望我的所有转换脚本都驻留在那里)。使用 INSERT INTO(在 CONV 上)它会触发调用函数的 INTERIM 表上的触发器。此函数检查表中的值,然后以“运行函数时关系“s_the_other_table”不存在”
  • 是的,我使用的是完整的 schema.table_name。在 INTERIM 数据库上运行相同的脚本可以工作。使用 foreign_schema.table_name 从 CONV 运行它不会。

标签: postgresql triggers schema postgres-fdw


【解决方案1】:

我一般不认为这个问题,所以它一定是关于你的设置的。

cat fdw_trigger.sql:

create database fgn;
\c fgn
create table a (x int);
create table b (x int);
create or replace function foobar() returns trigger language plpgsql as $$ BEGIN insert into public.b values(NEW.x); return new; END $$;
create trigger lsadkjf before insert on a for each row execute function foobar() ;
\c postgres
create schema fgn;
create extension postgres_fdw ;
create server fgn foreign data wrapper postgres_fdw OPTIONS ( dbname 'fgn');
create user MAPPING FOR CURRENT_USER SERVER fgn;
import foreign schema public from server fgn into fgn;
insert into fgn.a  values (13);
\c fgn
select * from b ;
select * from a ;

psql postgres -f fdw_trigger.sql

按预期工作。

【讨论】:

  • 感谢您的指点。问题是触发器和函数在 INTERIM 上,我从 CONV 插入。它在 INTERIM 上开始插入,看到触发器并触发它调用函数 - 但该函数应该检查 INTERIM 上的另一个表,但即使它确实存在于 INTERIM 上也看不到它。好像该函数是针对 CONV(表不存在)而不是针对 INTERIM 执行的。
  • 您的描述似乎与我所做的相符,并且对我有用。请创建您自己的可重现测试用例,或指出我们的用例存在分歧的地方。
  • 感谢您继续跟进,谢谢。也许在 fgn 表 a 上添加一个触发器,它调用一个函数来检查表 b 上的某些内容,然后尝试从 postgres 插入。这就是我所面临的,
猜你喜欢
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2012-04-11
  • 2013-06-11
  • 2015-11-11
  • 1970-01-01
相关资源
最近更新 更多