PostgreSQL触发器不会在更新时触发

时间:2014-07-04 11:07:51

标签: postgresql triggers

我正在使用PostgreSQL 9.3.4

远程更新了两个链接表:table1table2

table2使用table1中的外键依赖性。

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

  1. 插入table1返回id;
  2. 使用以前的ID
  3. 插入到table2中
  4. 发送查询(带有2个插入语句的1个事务)
  5. 我需要使用dblink将新行复制到远程数据库,所以我在更新之前创建了两个' table1和table2的触发器;

    问题是只有table2触发器正在触发;第一个不是(来自远程更新; 在同一个用户下从pgadmin进行测试查询,我得到两个触发器都被激活好了)

    我认为这是因为正在远程服务器上的1个事务/查询中处理更新。所以我尝试在第二个触发器中处理两个表,但仍然没有运气 - 只处理了table2。

    可能是什么原因?

    由于

    P.S。

    触发代码

    版本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();
    

1 个答案:

答案 0 :(得分:0)

如果是uid字段,原因是NULL值。它有bigint类型,并且在db中没有默认值,这会导致触发器无法正常工作。

修复是

IF (NEW.uid IS NULL )
     THEN  
     uid := 'DEFAULT';
     else
     uid :=  NEW.uid;
     END IF;
插入查询前的

;或(更简单)将默认值添加到db;