【问题标题】:PostgreSQL trigger not firing on updatePostgreSQL 触发器不会在更新时触发
【发布时间】:2014-07-04 11:07:50
【问题描述】:

我使用的是 PostgreSQL 9.3.4

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

table2 使用来自 table1 的外键依赖。

远程服务器上的表格更新方式如下:

  1. 插入table1返回id;
  2. 使用以前的 id 插入 table2
  3. 已发送查询(1 个事务和 2 个插入语句)

我需要使用 dblink 将新行复制到远程数据库,因此我为 table1 和 table2 创建了两个“更新前”触发器;

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

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

可能是什么原因?

谢谢

附言

触发代码

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

版本 2

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

【问题讨论】:

  • 在上面添加了触发代码;在这两种情况下,只有 table2 被复制,而 table1 不是
  • 你试过看 FDW 吗?这是 dbconn 的后续版本,并且更易于使用。设置完成后,您可以有效地使用 table1table2,就好像它们是本地关系一样。

标签: postgresql triggers


【解决方案1】:

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

解决方法是

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多