![触发器和 dblink](https://linux22.com/image/543063/%E8%A7%A6%E5%8F%91%E5%99%A8%E5%92%8C%20dblink.png)
我正在 PL/TCL 中开发一个触发器,该触发器在将数据库 A 中的表 A 插入时将数据插入数据库 B 中的表 B。两个数据库都在同一台服务器上。我想到了这个:
CREATE OR REPLACE FUNCTION add_to_erp() RETURNS trigger AS $$
BEGIN
IF (TG_OP='INSERT') THEN
perform dblink_connect('dbname=oerp_test user=postgres password=abouali');
perform dblink_exec('insert into product_template(standard_price, list_price, name)
values
('||NEW.pricebuy||','||NEW.pricesell||','||NEW.name||');');
perform dblink_exec('insert into product_product(product_tmpl_id) values (currval(''product_template_id_seq''::regclass));');
perform dblink_disconnect();
END IF;
RETURN NEW;
END; $$
LANGUAGE 'plpgsql';
CREATE TRIGGER add_to_erp_trigger AFTER INSERT ON products FOR EACH ROW EXECUTE PROCEDURE
add_to_erp();
但当我尝试:
INSERT INTO products (id,reference,code,name,pricebuy,pricesell,category,taxcat) VALUES (3,3,3,'apple',12,24,'000','000');
我得到:
错误:“apple”列不存在
如果我尝试:
INSERT INTO products (id,reference,code,name,pricebuy,pricesell,category,taxcat) VALUES (3,3,3,'34',12,24,'000','000');
它的成功
对于原因您有什么想法吗?
答案1
您需要在构建的查询中为名称列的值添加引号。您需要:
perform dblink_exec('insert into product_template(standard_price, list_price, name)
values ('||NEW.pricebuy||','||NEW.pricesell||','''||NEW.name||''');');
''
字符串中的位置变为'
,然后将其连接起来apple
,因此最终结果values (12,24,'apple')
变为values (12,24,apple)