更新时未触发PostgreSQL触发器

更新时未触发PostgreSQL触发器,postgresql,triggers,Postgresql,Triggers,我正在使用PostgreSQL 9.3.4 有两个远程更新的链接表:table1和table2 表2使用表1中的外键相关性 在远程服务器上以以下方式更新表: 在表1中插入返回的id 使用以前的id插入表2中 发送查询(1个事务和2个insert语句) 我需要使用dblink将新行复制到远程数据库,所以我为table1和table2创建了两个“更新前”触发器 问题是只有表2触发器触发;第一个不是(来自远程更新; 在同一个用户下从pgadmin执行测试查询时,我触发了两个触发器(OK) 我假设这是因

我正在使用PostgreSQL 9.3.4

有两个远程更新的链接表:
table1
table2

表2使用表1中的外键相关性

在远程服务器上以以下方式更新表:

  • 在表1中插入返回的id
  • 使用以前的id插入表2中
  • 发送查询(1个事务和2个insert语句)
  • 我需要使用dblink将新行复制到远程数据库,所以我为table1和table2创建了两个“更新前”触发器

    问题是只有表2触发器触发;第一个不是(来自远程更新; 在同一个用户下从pgadmin执行测试查询时,我触发了两个触发器(OK)

    我假设这是因为更新是在远程服务器上的一个事务/查询中处理的。所以我尝试在第二个触发器中处理这两个表,但仍然没有成功——只处理了表2

    原因可能是什么

    谢谢

    附言

    触发码

    第1版

    PROCEDURE fn_replicate_data:
    
    DECLARE
    
    BEGIN 
    
    PERFORM DBLINK_EXEC('myconn','INSERT INTO table1(dataid,sessionid,uid)  VALUES('||new.dataid||','||new.sessionid||',
    '||new.uid||') ');
    
    RETURN new;
    END;
    
    PROCEDURE fn_replicate_data2:
    
    DECLARE
    BEGIN 
    PERFORM DBLINK_EXEC('myconn','INSERT INTO table2(dataid,data)       VALUES('||new.dataid||','''||new.data||''') ');
    
    RETURN new;
    END;
    
    
    
    CREATE TRIGGER tr_remote_insert_data
    BEFORE INSERT OR UPDATE ON table1
    FOR EACH ROW EXECUTE PROCEDURE fn_replicate_data();
    
    CREATE TRIGGER tr_remote_insert_data2
    BEFORE INSERT OR UPDATE ON table2
    FOR EACH ROW EXECUTE PROCEDURE fn_replicate_data2();
    
    VERSION2

    PROCEDURE fn_replicate_data:
    
    DECLARE
    var table1%ROWTYPE;
    BEGIN 
            select * from table1 into var where dataid = new.dataid;  
            PERFORM DBLINK_EXEC('myconn','INSERT INTO table1(dataid,sessionid,uid) VALUES('||var.dataid||','||var.sessionid||','||var.uid||')  ');
    
    
        PERFORM 
        DBLINK_EXEC('myconn','INSERT INTO table2(dataid,data)   VALUES('||new.dataid||','''||new.data||''') ');
    
        RETURN new;
        END;
    
    
        CREATE TRIGGER tr_remote_insert_data
        BEFORE INSERT OR UPDATE ON table2
        FOR EACH ROW EXECUTE PROCEDURE fn_replicate_data();
    

    原因在uid字段中为空值。它有bigint类型,在db中没有默认值,这导致触发器不能正常工作

    解决办法是

    IF (NEW.uid IS NULL )
         THEN  
         uid := 'DEFAULT';
         else
         uid :=  NEW.uid;
         END IF;
    

    在插入查询之前;或(更简单)向db添加默认值

    上面增加了触发器代码;在这两种情况下,只有表2是复制的,表1不是你试过看FDW吗?这是dbconn的后续操作,更易于使用。设置后,您可以有效地使用
    表1
    表2
    ,就像它们是本地关系一样。