72

我习惯于 Oracle 并在我的模式中创建一个 dblink,然后像这样访问远程数据库:mytable@myremotedb无论如何,PostgreSQL 有没有做同样的事情?

现在我正在使用这样的dblink:

SELECT logindate FROM dblink('host=dev.toto.com
                              user=toto
                              password=isok
                              dbname=totofamily', 'SELECT logindate FROM loginlog');

当我执行此命令时,我收到以下错误:

提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

有人有想法吗?在使用它们之前,我们是否必须“激活” dblink 或做一些事情?

我们要查询的远程数据库有什么事情要做吗?我们也必须激活 dblink 吗?我一直有一个could not establish connection。这是行是类型:

SELECT dblink_connect_u('host=x.x.x.x dbname=mydb user=root port=5432');

IP 地址正确且 Postgres 正在远程服务器上运行。任何想法?

4

6 回答 6

130

PostgreSQL 9.1开始,安装附加模块很简单。可以使用以下方式安装已注册的扩展dblinkCREATE EXTENSION程序:

CREATE EXTENSION dblink;

安装到您的默认架构中,这是public默认情况下。search_path在运行命令之前,请确保您的设置正确。该模式必须对必须使用它的所有角色可见。看:

或者,您可以安装到您选择的任何架构:

CREATE EXTENSION dblink SCHEMA extensions;

看:

每个数据库运行一次。或者在标准系统数据库中运行它以自动template1将其添加到每个新创建的数据库中。手册中的详细信息。

您需要首先在服务器上安装提供模块的文件。对于 Debian 和衍生产品,这将是软件包postgresql-contrib-9.1- 显然是 PostgreSQL 9.1。从 Postgres 10 开始,只有一个postgresql-contrib元包。

于 2012-11-07T07:22:39.790 回答
29

我正在使用 DBLINK 连接内部数据库以进行跨数据库查询。

参考来自这篇文章。

安装 DbLink 扩展。

CREATE EXTENSION dblink;

验证 DbLink:

SELECT pg_namespace.nspname, pg_proc.proname 
FROM pg_proc, pg_namespace 
WHERE pg_proc.pronamespace=pg_namespace.oid 
   AND pg_proc.proname LIKE '%dblink%';

数据库连接测试:

SELECT dblink_connect('host=localhost user=postgres password=enjoy dbname=postgres');
于 2015-10-23T09:44:46.510 回答
12

在 linux 上,找到 dblink.sql,然后在 postgresql 控制台中执行类似这样的命令来创建所有必需的函数:

\i /usr/share/postgresql/8.4/contrib/dblink.sql 

您可能需要安装 contrib 包:sudo apt-get install postgresql-contrib

于 2011-03-03T02:16:17.217 回答
4

安装模块通常需要您运行包含在数据库安装中的 sql 脚本。

假设类 linux 操作系统

find / -name dblink.sql

验证位置并运行它

于 2010-10-05T10:20:55.210 回答
2

可以使用以下方法添加:

$psql -d databaseName -c "CREATE EXTENSION dblink"
于 2014-10-09T13:11:38.393 回答
1
# or even faster copy paste answer if you have sudo on the host 
sudo su - postgres  -c "psql template1 -c 'CREATE EXTENSION IF NOT EXISTS \"dblink\";'"
于 2017-07-28T15:14:42.810 回答