【问题标题】:Postgresql: trigger on foreign table to execute function to truncate/insert into local tablePostgresql:在外部表上触发以执行截断/插入本地表的功能
【发布时间】:2020-05-18 11:35:05
【问题描述】:

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

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

    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. 进行了测试:在外部数据库表“foreign_table”中插入了新行,但我看不到该表被截断并且没有插入新数据。对 foreign_tale 的插入是在外部数据库中完成的。 问题还在于测试此触发功能是否有效,手动执行会产生错误: EXECUTE PROCEDURE reset_insert_table(); 错误:“执行”处或附近的语法错误 也尝试了 CALL 和 SELECT。 我为测试创建了相同的函数,但使用 'RETURNS VOID' 定义了 'RETURNS TRIGGER' 并且函数正在运行。

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

【问题讨论】:

    标签: postgresql function database-trigger truncate


    【解决方案1】:

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

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

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

    ALTER TABLE a2 ENABLE REPLICA TRIGGER trigger_name;
    

    【讨论】:

    • 另外一点是:您不能对remote DBMS 执行任何操作;你只能观察它。
    • 感谢您的解释,现在很明显我不能在外表上使用我当前的触发器设置。
    • 现在我能够复制表并且它可以工作:新行将插入到目标副本表中,但是我为截断和插入创建的触发器以某种方式不起作用。似乎触发器不会调用该函数。我对触发函数的定义似乎完全可行吗?
    • 无法回答,因为您没有描述自己在做什么。我想我的回答涵盖了它:a2 上定义的触发器只有在您对a2 执行数据修改时才会执行。*
    • 如果对定义触发器的表执行DML操作,触发器会触发。
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2019-11-04
    • 2019-12-24
    • 1970-01-01
    • 2019-11-02
    相关资源
    最近更新 更多