首页 > 解决方案 > 如何正确防止尝试将数据插入到不可访问的外部表的插入触发器之后的延迟

问题描述

我使用 PostgreSQL 11。

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

所以我创建了一个外部表......让我们调用它foo,我有一个AFTER INSERT触发器,它执行一个函数,该函数将该行插入到配置的远程服务器上的外部表中。

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

所以我对这个问题有几个问题:

  1. 查询执行能否在执行后插入之前返回客户端,这样就不会阻止用户执行其他插入

  2. 系统可以检查此服务器的有效性,如果它无法连接到它以标记它几分钟,因此它甚至不会尝试将插入发送给它?

一般来说,插入被发送到备份服务器,如果服务器没有响应或者响应时间太长,它不应该对客户端产生任何影响。

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

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

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

假设 foo 是我的外表。

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();

标签: postgresqltriggersforeign-data-wrapper

解决方案


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

所以这不是要走的路!

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

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

谢谢大家!:)


推荐阅读