Postgres:在外表上触发

问题描述 投票:0回答:2

我想使用

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();
postgresql database-trigger postgres-fdw
2个回答
2
投票

根据https://stackoverflow.com/a/64496191这是不可能的。仅当您修改本地服务器上的数据(而不是远程服务器上的数据)时,外部表上的触发器才会触发。

顺便说一下,讨论中提到的文章(https://paquier.xyz/postgresql-2/postgres-9-4-feature-highlight-trigger-foreign-tables/)给出了一个关于这种情况的示例:通过外表修改数据,从而触发触发器。


0
投票

看起来不直接支持。 据我了解 - 这需要编写(在 fdw 的后端)一个可以访问 pg 数据库的服务,该服务将调用一些模拟“远程触发器”的存储过程。 尽管如此,您仍然会遇到检测这些“插入”的方法的问题(因为数据是外部的)。 从技术上讲,可以用 Python 在 Multicorn 上实现它。

© www.soinside.com 2019 - 2024. All rights reserved.