【发布时间】:2019-08-09 14:44:25
【问题描述】:
我正在尝试在 postgresql 9.6 中设置一个触发器,当将一行插入到它自己的表中时,它将使用 dblink 将一行插入到另一个数据库中。由于可能有大量这些插入,我不想在每次插入时都连接和断开与数据库的连接,所以我希望有一个持久连接,每个插入都使用它。但我认为我必须测试连接是否可用,因为很多事情都可能导致连接断开。
我的伪代码如下:
-- 1. test if named dblink connection already exists
-- 2. if it does not, create a named dblink connection
-- 3. insert data via dblink
我目前的情况是这样的:
CREATE OR REPLACE FUNCTION db_link_trigger()
RETURNS trigger AS
$BODY$
BEGIN
-- 1. test if named dblink connection already exists
IF (SELECT COALESCE('dblinktest' = ANY (dblink_get_connections()), false)) = false THEN
-- 2. if it does not, create a named dblink connection
RAISE NOTICE 'dblink connection not established. Connecting now';
PERFORM dblink_connect('dblinktest', 'hostaddr=192.168.1.30 port=5433 dbname=otherdb user=myuser password=mypassword');
ELSE
RAISE NOTICE 'dblink connection already established';
END IF;
-- 3. insert data via dblink
PERFORM dblink_exec('dblinktest', 'insert into mytable(data) values(''' || NEW.data || ''');');
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
我主要关心的是如何处理错误以及如何处理触发器的近乎同时调用。考虑两个 INSERTS 是否同时进入,并且之前没有名为 'dblinktest' 的 dblink。当第一个发现连接不存在时,它会继续设置它。然后第二个可以看到链接也没有建立并尝试连接自己,但它会失败,因为第一个会在它之前连接,它会引发错误:
ERROR: duplicate connection name
我该如何处理这样的错误? postgresql 有类似这种受 python 启发的伪代码吗?
try:
if dblink connection is not established:
establish dblink connection
except 'ERROR: duplicate connection name':
pass # do nothing
finally:
insert row into other db via dblink connection
【问题讨论】:
-
嗨,尝试使用带有 EXCEPTION 子句的 BEGIN 块,在 de doc 中您可以看到详细信息 postgresql.org/docs/10/…,您可以在 thist 代码块中管理错误
-
感谢您的建议!你能帮我了解如何处理这个特殊的异常吗?
标签: postgresql exception error-handling postgresql-9.6 dblink