带有 dblink 的 postgresql 触发器不返回任何内容

标签 postgresql triggers postgis dblink

我创建了一个触发器来将数据库 1 中的表“mytable_db1”的插入复制到数据库 2 中的同一个表“mytable_db2”中。两个数据库都在同一台服务器上。

CREATE OR REPLACE FUNCTION trigger_osm_test_insert()
RETURNS trigger AS
$BODY$
BEGIN
  PERFORM dblink_connect('db2', 'dbname=xxx port=5432 user=myusr password=xxx');
  PERFORM dblink_exec('db2', 
  'insert into test.mytable_db2 (osm_id, name, name_eng, name_int, type, z_order, population, last_update, country, iso3, shape)
  values ('||new.osm_id||', '''||new.name||''', '''||new.name_eng||''', '''||new.name_int||''', '''||new.type||''', '||new.z_order||',
  '||new.population||', '''||new.last_update||''', '''||new.country||''', '''||new.iso3||''',
  st_geometry((st_AsText('''||new.shape::text||'''))))');
  PERFORM dblink_disconnect('db2');
  RETURN new;
END;
$BODY$
 LANGUAGE plpgsql VOLATILE
 COST 100;
ALTER FUNCTION trigger_osm_test_insert()
 OWNER TO myusr;

CREATE TRIGGER osm_insert_test
 AFTER INSERT
 ON mytable_db1
 FOR EACH ROW
 EXECUTE PROCEDURE trigger_osm_test_insert();

但是,当我进行如下测试插入时:

insert into test.mytable_db1 (name, shape) values ('test', '0101000020E6100000E0979950035F4A40404B2751B0861CC0');

插入的行已插入到 mytable_db1 中,但触发器似乎不起作用,因为我在 mytable_db2 中没有任何内容。插入没有给我任何来自触发器的错误消息。

我正在使用 postgresql 9.2.2。两个数据库都安装了 dblink 1.0 以及 postgis 2.0.6。

有人对我做错了什么有建议吗?

谢谢!

最佳答案

有更好的解决办法

再举个例子

-- Function: flux_tresorerie_historique_backup_row()

-- DROP FUNCTION flux_tresorerie_historique_backup_row();

CREATE OR REPLACE FUNCTION flux_tresorerie_historique_backup_row()
  RETURNS trigger AS
$BODY$
BEGIN
  perform dblink_connect('dbname=gtr_bd_archive user=postgres password=postgres');
  perform dblink_exec('insert into flux_tresorerie_historique values('||
    concat_ws(', ', quote_nullable(OLD.id_flux_historique),
                    quote_nullable(OLD.date_operation_flux),
                    quote_nullable(OLD.date_valeur_flux),
                    quote_nullable(OLD.date_rapprochement_flux),
                    quote_nullable(OLD.libelle_flux),
                    quote_nullable(OLD.montant_flux),
                    quote_nullable(OLD.contre_valeur_dzd),
                    quote_nullable(OLD.rib_compte_bancaire),
                    quote_nullable(OLD.frais_flux),
                    quote_nullable(OLD.sens_flux),
                    quote_nullable(OLD.statut_flux),
                    quote_nullable(OLD.code_devise),
                    quote_nullable(OLD.code_mode_paiement),
                    quote_nullable(OLD.code_agence),
                    quote_nullable(OLD.code_compte),
                    quote_nullable(OLD.code_banque),
                    quote_nullable(OLD.date_maj_flux),
                    quote_nullable(OLD.statut_frais),
                    quote_nullable(OLD.reference_flux),
                    quote_nullable(OLD.code_commission),
                    quote_nullable(OLD.id_flux)
           )||');');
  perform dblink_disconnect();
  RETURN NULL;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION flux_tresorerie_historique_backup_row()
  OWNER TO postgres;

如果您的表格是相同的,您可以像这样使用“格式”

CREATE OR REPLACE FUNCTION flux_tresorerie_historique_backup_row()
  RETURNS trigger AS
$func$
BEGIN
   PERFORM dblink_connect('myserver');  -- name of foreign server

   PERFORM dblink_exec( format(
   $$
   INSERT INTO flux_tresorerie_historique
   SELECT (%L::flux_tresorerie_historique).*
   $$
   , OLD::text));

   PERFORM dblink_disconnect();
   RETURN NULL;  -- only for AFTER trigger
END
$func$  LANGUAGE plpgsql;

关于带有 dblink 的 postgresql 触发器不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35296562/

相关文章:

mysql - 将远程位置 B 到 L 的数据库中的相似数据集中到位置 A 的数据库中

sql - 定时触发删除数据

django - 无法从 OSX 终端应用程序创建 postgres 数据库

postgresql - zip : ERROR: parse error - invalid geometry

Postgresql:运行 SQL 查询脚本并导出到 csv

php - 比较 SQL 请求中的两个日期

postgresql - 有没有办法设置一个选项,即使出现错误也会导致 PostgreSQL 脚本继续?

MySQL 创建触发器(包括变量)语法

sql-server - 使用SQLAlchemy将数据从MS SQL迁移到PostgreSQL

sql - CTE SQL查询在两个方向上递归