postgresql:在远程数据库上插入dblink

时间:2017-02-02 13:33:25

标签: postgresql triggers dblink

这是我的情况,

我有两个数据库( db1 db2 ),都有表"国家"。当我在 db1 .countries上插入时,我需要自动插入 db2 .countries。我使用 dblink 模块连接第二个数据库。

国家/地区表SQL架构是:

CREATE TABLE countries (
  id INTEGER PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  flag VARCHAR(5) 
);

要管理这种情况,请在 db1 上创建以下过程:

CREATE OR REPLACE FUNCTION prc_insert_to_countries()
      RETURNS trigger AS
    $$
    DECLARE 
        insert_statement TEXT;
        res TEXT;
    BEGIN                
        perform dblink_connect('db2', 'dbname=db2 host=localhost 
        user=xxx password=xxx');

        insert_statement = 'insert into countries(id, name, flag) 
                                    values ('||NEW.id||', 
                                    '''||NEW.name||''', 
                                    '''||NEW.flag||'''
                                    );';
        res := dblink_exec('db2', insert_statement, true);
        RAISE INFO '%', res;
        perform dblink_disconnect('db2');
        RETURN NEW;
    END;
    $$
    LANGUAGE 'plpgsql';

以下触发器:

CREATE TRIGGER tr_countries
      AFTER INSERT
      ON countries
      FOR EACH ROW
      EXECUTE PROCEDURE prc_insert_to_countries();

如果我在 db1 上执行下一个插入语句:

INSERT INTO countries (id, name, flag) VALUES (1, 'Italy', 'ITA');

一切正常,插入的行也插入到 db2 .countries中。 但是如果我执行:

INSERT INTO countries (id, name, flag) VALUES (1, 'Italy', NULL);

插入的行未插入 db2 .countries ...

我试图用这篇文章来解决这个问题:postgresql trigger with dblink doesn't return anything但它并没有这样做。让我工作..

我该如何解决这个问题?

感谢。

1 个答案:

答案 0 :(得分:0)

NULL字段会产生问题,请尝试使用COALESCE这样处理NULL:

insert_statement = 'insert into countries(id, name, flag) 
                                    values ('||NEW.id||', 
                                    '''||NEW.name||''', 
                                    '''||COALESCE(NEW.flag,'')||'''
                                    );';

请记住,远程数据库中的flag字段将得到一个空字符串,等于NULL。