Postgres:在外部表上创建触发器

10
我希望使用postgres_fdw在我的数据库中设置一个FOREIGN TABLE。是否可以在本地服务器上为此FOREIGN TABLE定义一个触发器,以识别远程服务器上的INSERT事件?如果可以,请提供一个示例。

数据流:

  1. 将数据插入到远程服务器上的表中。
  2. 在本地服务器的外部表上识别插入并触发触发器。
  3. 触发器函数将数据写入其他表中。
  4. 在成功写入后,返回到外部表

粗略的想法如下图所示:


没有报告错误,但是向table_b写入似乎不成功。

这是我尝试的:

CREATE FOREIGN TABLE x.table_a   -- note the foreign table is in a different schema than the local table
( id        BIGINT           NOT NULL                   
, data_ts   TIMESTAMPTZ      DEFAULT CURRENT_TIMESTAMP
, xchg_ts   TIMESTAMPTZ      DEFAULT NULL
)
SERVER remote_server
OPTIONS (schema_name 'schema_a', table_name 'table_a')
;

CREATE TABLE y.table_b
( xchg_id    BIGINT
, error_msg  TEXT DEFAULT NULL
);

CREATE OR REPLACE FUNCTION func_foreign_table_a_after_insert()
RETURNS TRIGGER
AS $$
BEGIN
    INSERT INTO y.table_b
        (xchg_id)
    VALUES
        (NEW.id)
    ;
    RETURN NEW;
END;
$$  LANGUAGE PLPGSQL
;

CREATE TRIGGER trig_foreign_table_a_after_insert
AFTER INSERT ON x.table_a
FOR EACH ROW EXECUTE PROCEDURE func_foreign_table_a_after_insert();

2
我可能理解有误,但这个链接表明应该可以工作 https://paquier.xyz/postgresql-2/postgres-9-4-feature-highlight-trigger-foreign-tables/ - Jonathan DS
有趣。我得再看一眼。谢谢你提供的链接。 - J Spratt
1
@JSpratt 你有成功吗?我发现自己处于同样的情况。 - Zdenek F
@ZdenekF 我想我最终在本地数据库中复制了表格,并编写了一个Bash轮询脚本来进行传输。当我写这个问题时,我受到时间限制,但我仍然希望在某个时候回过头来再尝试一次。 - J Spratt
有人真的让这个工作了吗?对于我来说,外部表上的触发器仍然无法工作。我遵循了这个指南:https://paquier.xyz/postgresql-2/postgres-9-4-feature-highlight-trigger-foreign-tables/ - phips28
显示剩余10条评论
1个回答

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接