postgresql:在远程数据库上插入dblink
这是我的情况, 我有两个数据库(db1、db2),都有表“countries”。当我在db1.countries上插入时,需要在db2.countries上自动插入。我正在使用dblink模块连接第二个数据库 国家/地区表SQL架构为: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
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()函数可以很好地工作。谢谢