我想使用
postgres_fdw
并在我的数据库中保存 FOREIGN TABLE
。是否可以在本地服务器上为此 FOREIGN TABLE
定义一个触发器,以识别远程服务器上的 INSERT
事件。如果是的话,请提供一个例子。
数据流:
没有报错,但是写入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();
根据https://stackoverflow.com/a/64496191这是不可能的。仅当您修改本地服务器上的数据(而不是远程服务器上的数据)时,外部表上的触发器才会触发。
顺便说一下,讨论中提到的文章(https://paquier.xyz/postgresql-2/postgres-9-4-feature-highlight-trigger-foreign-tables/)给出了一个关于这种情况的示例:通过外表修改数据,从而触发触发器。
看起来不直接支持。 据我了解 - 这需要编写(在 fdw 的后端)一个可以访问 pg 数据库的服务,该服务将调用一些模拟“远程触发器”的存储过程。 尽管如此,您仍然会遇到检测这些“插入”的方法的问题(因为数据是外部的)。 从技术上讲,可以用 Python 在 Multicorn 上实现它。