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

时间:2012-09-06 09:51:57

标签: postgresql postgresql-9.1

我查看以下链接,我使用并完美运行。但我想反对这件事。

Postgresql: dblink in Stored Functions

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

本地数据库名称:localdatabase

远程数据库名称:remotedatabase

任何人都可以建议我怎么做?

提前致谢。

1 个答案:

答案 0 :(得分:2)

以下几行应该有效:

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调用之后还有其他值返回语句。