Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql:在远程数据库上插入dblink_Postgresql_Triggers_Dblink - Fatal编程技术网

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

postgresql:在远程数据库上插入dblink,postgresql,triggers,dblink,Postgresql,Triggers,Dblink,这是我的情况, 我有两个数据库(db1、db2),都有表“countries”。当我在db1.countries上插入时,需要在db2.countries上自动插入。我正在使用dblink模块连接第二个数据库 国家/地区表SQL架构为: CREATE TABLE countries ( id INTEGER PRIMARY KEY, name VARCHAR(100) NOT NULL, flag VARCHAR(5) ); 为了管理这种情况,我在db1上创建了以下过程: CRE

这是我的情况,

我有两个数据库(db1、db2),都有表“countries”。当我在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语句:

所有这些都可以很好地工作,插入的行也被插入到db2.countries中。 但如果我执行:

INSERT INTO countries (id, name, flag) VALUES (1, 'Italy', NULL);
插入的行未插入db2.countries

我试着用这篇文章来解决这个问题:但它对我不起作用

我怎样才能解决这个问题


谢谢。

空字段会产生问题,请尝试使用COALESCE处理空字段,如下所示:

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

请记住,远程数据库中的标志字段将获得空字符串isntead NULL。

空字段会产生问题,请尝试使用COALESCE如下方式处理空字符串:

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

请记住,远程数据库中的标志字段将得到一个空字符串isntead NULL。

这可能是因为将(
|
)与
NULL
串联在一起会导致
NULL
(您的
插入\u语句将
为NULL
)。此外,连接SQL语句为SQL注入提供了可能性。使用该函数而不是手动连接。或quote_nullableUsing format()函数可以很好地工作。谢谢这可能是因为将(
|
)与
NULL
连接会导致
NULL
(您的
insert_语句将是
NULL
)。此外,连接SQL语句为SQL注入提供了可能性。使用该函数而不是手动连接。或quote_nullableUsing format()函数可以很好地工作。谢谢