我正在使用PostgreSQL 9.3.4
远程更新了两个链接表:table1
和table2
table2使用table1中的外键依赖性。
在远程服务器上以下列方式更新表:
我需要使用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();
答案 0 :(得分:0)
如果是uid字段,原因是NULL值。它有bigint类型,并且在db中没有默认值,这会导致触发器无法正常工作。
修复是
IF (NEW.uid IS NULL )
THEN
uid := 'DEFAULT';
else
uid := NEW.uid;
END IF;
插入查询前的;或(更简单)将默认值添加到db;