使用dblink

时间:2019-07-18 08:10:14

标签: sql postgresql pgadmin

我想要做的是连接2个数据库,并通过dblink将数据从一个数据库移动到另一个数据库。这是我所做的:

  1. 我创建了dblink扩展
    • 1.1。我创建了一个postgres_fdw扩展名
  2. 我已验证dblink是否有效(请参见代码)
  3. 我测试了数据库的连接
  4. 我创建了一个外部数据包装器
  5. 我创建了一个具有连接详细信息的服务器 5.1我将服务器与用户映射起来
  6. 我测试了创建的服务器(错误消息-我的主要问题!)
  7. 我已授予映射用户所需的权限
  8. 选择查询

我已经在搜索问题两天了,找不到任何可以帮助我的东西。

SELECT dblink_connect('host=localhost user=postgres password=mypw dbname=nameofthedb')

create foreign data wrapper fdw validator postgresql_fdw_validator;

Create Server Ahmed FOREIGN DATA WRAPPER FDW OPTIONS (hostaddr '127.0.0.1',dbname 'nameofthedb');

CREATE USER MAPPING FOR postgres server Ahmed OPTIONS (user 'postgres', password 'mypw');

select dblink_connect('Ahmed') -- NOT WORKING
GRANT USAGE ON FOREIGN SERVER Ahmed TO postgres*/

select * from dblink ('Ahmed', 'select id from nameofthedb.public.pois') --not working AS DATA(id INTEGER);

这是我得到的错误:

错误:无法建立连接

详细信息::连接信息字符串中“ Ahmed”后缺少“ =”

SQL状态:08001

1 个答案:

答案 0 :(得分:1)

这是区分大小写的问题。

SQL不区分大小写,因此PostgreSQL会将字符串常量和双引号中的标识符之外的所有SQL转换为小写。

因此,外部服务器实际上称为ahmed

dblink调用中的第一个参数是字符串文字'Ahmed'转换为小写。

因此,dblink首先查找命名连接Ahmed,找不到它,然后寻找外部服务器Ahmed再次找不到它< / em>,最后求助于将其解释为连接字符串,这会导致错误消息。

解决方案::仅使用小写字母名称。