如何正确防止尝试将数据插入不可访问的外部表的插入触发器后的延迟

how to properly prevent delays from after insert triggers that try to insert data to foreign tables that are not accessible

我使用 PostgreSQL 11。

我使用 postgres_fdw 扩展将行插入到不同服务器上的 table。

所以我创建了一个外国 table.. 我们称之为 foo, 我有一个 AFTER INSERT 触发器执行一个函数,该函数将该行插入到配置的远程服务器上的外部 table。

如果服务器没有响应,触发器将冻结直到超时。

所以我有几个关于这个问题的问题:

  1. 可以在执行后插入之前将查询执行return到客户端,因此不会阻止用户执行其他插入

  2. 系统能否检查该服务器的有效性,如果它无法连接到它,可以标记它几分钟,这样它甚至不会尝试向它发送插入内容?

一般情况下,插入内容会发送到备份服务器,如果服务器没有响应或响应时间过长,对客户端应该没有任何影响。

所以我不希望后插入延迟行实际插入到 table 并且我不希望任何与连接相关的问题导致任何延迟。

我怎样才能实现这样的事情?

我将创建一个示例代码,以便您了解我在做什么。

假设 foo 是我的外语 table。

CREATE OR REPLACE FUNCTION after_insert() RETURNS TRIGGER AS $after_insert$
DECLARE
    res BOOL;
BEGIN
    INSERT INTO foo(bar1,bar2,bar3) values(foo1,foo2,foo3);
    EXCEPTION WHEN OTHERS THEN  raise NOTICE '% %', sqlstate, sqlerrm;
    RETURN NEW;
END;
$after_insert$ LANGUAGE plpgsql;


CREATE TRIGGER after_insert AFTER INSERT
    ON my_table FOR EACH ROW EXECUTE PROCEDURE after_insert();

我开始明白使用 after insert 触发器向其他表添加复杂数据是一种不好的做法。我希望即使 after 触发器失败也能插入该行,而且我真的不希望 after insert 触发器延迟插入。

所以这不是要走的路!

相反,我创建了一个 cron 作业,每隔几分钟在新行上运行一次。

经过大量研究,我现在明白,如果我想创建的任何触发器不会真正影响我插入的行并且不应该延迟它..我不应该使用触发器。现在听起来很合理:)

谢谢大家! :)