更新时未触发PostgreSQL触发器
我正在使用PostgreSQL 9.3.4 有两个远程更新的链接表:更新时未触发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) 我假设这是因
table1
和table2
表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
,就像它们是本地关系一样。