Postgresql:触发外部 table 执行函数 truncate/insert 到本地 table

Postgresql: trigger on foreign table to execute function to truncate/insert into local table

我想创建触发器来执行函数以截断本地数据库 table 并插入新数据。 触发器执行必须在新行插入外部数据库 table 后开始。 我已经阅读了很多关于在外国 table 上创建触发器的内容,但对我来说它不起作用。当新行将插入外部 table 时,触发器似乎不执行函数。触发器似乎看不到这个新行插入事件。 我做了什么:

  1. 在我的本地数据库中创建了外国 table,我们称之为 'foreign_table'。我测试了,可以读取数据。
  2. 已创建截断本地 table 并插入新数据的函数:

    CREATE or replace FUNCTION public.reset_insert_table()
    RETURNS TRIGGER
        LANGUAGE 'plpgsql'
        SET search_path=public
     AS $BODY$
    BEGIN
        create temporary table temporary_table_tmp
        as select * from public.table1;
        TRUNCATE TABLE public.table2;
        insert into table2
            select * from temporary_table_tmp;
        DROP table temporary_table_tmp; 
    END;    
    $BODY$;
    
  3. 已创建启动函数的触发器'reset_insert_table()'

    CREATE TRIGGER local_table_update
        AFTER INSERT
        ON 'foreign_table'
        FOR EACH ROW EXECUTE PROCEDURE reset_insert_table();
    
  4. 进行了测试:在外部数据库table 'foreign_table'中插入了新行,但是我看不到table被截断并且没有插入新数据。 foreign_tale 的插入是在外部数据库中完成的。 问题还在于测试此触发功能是否有效,手动执行会产生错误: EXECUTE PROCEDURE reset_insert_table(); 错误:"execute" 处或附近的语法错误 还尝试了 CALL 和 SELECT。 我为测试创建了相同的函数,但定义了'RETURNS TRIGGER'used 'RETURNS VOID' 并且函数正在运行。

谁能告诉我为什么我的解决方案不起作用并且在外国 tables 上触发必须看到在外国 tables 发生的事件?

根据您的评论,您似乎正在使用逻辑复制。

虽然数据修改在具有逻辑复制的备用数据库上重放,但参数 session_replication_role 设置为 replica 以防止触发器和外键约束起作用。

如果您希望通过逻辑复制重放数据来触发触发器,您必须将其声明为副本触发器:

ALTER TABLE a2 ENABLE REPLICA TRIGGER trigger_name;