【发布时间】:2014-07-04 11:07:50
【问题描述】:
我使用的是 PostgreSQL 9.3.4
有两个远程更新的链接表:table1 和 table2
table2 使用来自 table1 的外键依赖。
远程服务器上的表格更新方式如下:
- 插入table1返回id;
- 使用以前的 id 插入 table2
- 已发送查询(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 的后续版本,并且更易于使用。设置完成后,您可以有效地使用
table1和table2,就好像它们是本地关系一样。
标签: postgresql triggers