这是我的情况,
我有两个数据库( 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但它并没有这样做。让我工作..
我该如何解决这个问题?
感谢。
答案 0 :(得分:0)
NULL字段会产生问题,请尝试使用COALESCE这样处理NULL:
insert_statement = 'insert into countries(id, name, flag)
values ('||NEW.id||',
'''||NEW.name||''',
'''||COALESCE(NEW.flag,'')||'''
);';
请记住,远程数据库中的flag字段将得到一个空字符串,等于NULL。