Postgresql:从本地到远程数据库的存储函数中的 dblink

Posted

技术标签:

【中文标题】Postgresql:从本地到远程数据库的存储函数中的 dblink【英文标题】:Postgresql: dblink in Stored Functions from local to remote database 【发布时间】:2012-09-06 09:51:56 【问题描述】:

我检查了我使用并运行良好的以下链接。但我想反对这件事。

Postgresql: dblink in Stored Functions

我的场景:有两个数据库。我想将一个表数据从本地复制到远程数据库。我使用了 dblink,但我很困惑如何使用 dblink 来存储数据?

本地数据库名称:localdatabase

远程数据库名称:remotedatabase

谁能建议我如何做到这一点?

提前致谢。

【问题讨论】:

基本上答案中描述的方法对您有用。您必须将 dblink() 替换为 dblink_exec(),这将用于不返回行的 SQL 语句(如您的情况下的 INSERT)。 感谢您的快速回复,但我想将本地数据库中的所有数据插入远程数据库。那时我在本地,想使用 dblink 传输所有数据。有可能吗? 请在下面查看我的答案。 【参考方案1】:

下面几行应该可以工作:

SELECT dblink_connect('hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd');
-- change the connection string to your taste

SELECT dblink_exec('INSERT INTO test (some_text) VALUES (''Text go here'');');

其中test 是远程数据库中的一个表,其定义如下:

CREATE TABLE test(
    id serial
    , some_text text
);

运行dblink_exec() 后,您可以在远程数据库中检查结果(或在本地,使用dblink(),如下例所示)。

SELECT * FROM dblink('SELECT id, some_text FROM test') AS d(id integer, some_text text);
 id |  some_text
----+--------------
  1 | Text go here
(1 row)

您也可以将 dblink_exec 调用包装在一个函数中:

CREATE OR REPLACE FUNCTION f_dblink_test_update(val text, id integer) RETURNS text AS
$body$
SELECT dblink_exec('UPDATE torles.test SET some_text=' || quote_literal($1) || ' WHERE id = ' || $2);
$body$
LANGUAGE sql;

如您所见,您甚至可以动态构建查询字符串。 (并不是我提倡这种方法,因为您必须小心不要以这种方式将 SQL 注入漏洞引入您的系统。)

由于dblink_exec 会返回一条关于它所做操作的文本消息,因此您必须将您的函数定义为RETURNS text,除非在dblink_exec 调用之后还有其他值返回语句。

【讨论】:

是否可以在 dblink 的帮助下使用过程更新查询?

以上是关于Postgresql:从本地到远程数据库的存储函数中的 dblink的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 S3 存储桶的情况下将数据从远程服务器的 .gz 文件加载到 redshift 的 postgresql 实例?

lightdb数据库链接之postgresql_fdw

将 postgresql 本地复制到远程数据库(都带有密码) - 错误:无法识别选项“区域设置”

PostgreSQL(丢失数据的复制或复制)-远程主PostgreSQL的只读权限

从远程数据库中获取并存储到本地 django

PostgreSQL从存储函数访问多个数据库