postgres_fdw的使用参考来自:https://my.oschina.net/Kenyon/blog/214953

postgres跨库查询可以通过dblink或者postgres_fdw来完成,二者的比较可以参看文档:https://my.oschina.net/u/270810/blog/174791

1.安装fdw扩展

 create extension postgres_fdw;

查询postgres的所有拓展,验证fdw安装成功:

 select * from pg_available_extensions; 

2.创建远程server

server_remote是给这个远程server取得名字。options中是连接远程server需要的信息,包括地址、端口和需要连接的数据库名。

 create server server_remote
FOREIGN data wrapper postgres_fdw
OPTIONS(host '168.2.237.207', port '', dbname 'aasccs');

查看所有远程连接,验证server创建成功。

 SELECT * from pg_foreign_server;

3.创建用户匹配信息

表示在server_remote下为角色postgres创建一个用户匹配信息,options里是用户名和密码。

 create user mapping for postgres server server_remote options(user 'postgres',password 'yourpassword');

4.在本地创建外部表

现在远程连接中需要连接的数据库为aasccs,需要用到的表为t_resource和t_permission,因此在完成上述创建后,就可以在本地创建外部表,表中的记录则完全和远程表中一样。

注:本地t_resource表中字段列数可以少于远程t_resource表,但是字段名必须完成一致,否则会提示错误。

 CREATE FOREIGN TABLE t_resource
( fd_resid SERIAL,
fd_res_name TEXT,
fd_res_desc TEXT,
fd_tenantid INTEGER,
fd_service TEXT,
fd_display_name TEXT,
fd_modify_date TEXT,
fd_modify_person_id INTEGER
)
server server_remote
options (table_name 't_resource'); CREATE FOREIGN TABLE t_permission
( id SERIAL,
fd_groupid INTEGER,
fd_res_name TEXT,
fd_resid INTEGER,
fd_get BOOLEAN,
fd_post BOOLEAN,
fd_put BOOLEAN,
fd_delete BOOLEAN,
fd_modify_date TEXT,
fd_modify_person_id INTEGER
)
server server_remote
options (table_name 't_permission');

创建完后,可以看到本地也生成了t_resource表和t_permission表。

5.测试

(1)在本地数据库中运行查询sql

 select * from t_resource;

结果:跨库查询成功。

(2)在远程t_resource表中插入一条记录

结果:本地t_resource表中同步多了一条记录。

(3)在本地t_resource表中插入一条记录,使其自动生成id

结果:主键报异常。原因是虽然本地t_resource表中拥有了远程表中一样的数据,但是新增时,主键却依然从1开始自增。而不是接着原来的id顺序。(使用sql新增也同样)

在创建本地t_resource表时尝试加入主键信息,但是创建时候报错了。因为跨库的时候,创建如果使用自增id,会报错。

(4)在本地t_resource表中插入一条记录,其依赖的外键t_tenantid不存在

结果:新增失败,提示外键不存在。所以可见本地表仍然保持了远程表的外键信息。

(5)在本地t_resource表中插入一条记录,唯一键冲突

结果:新增失败,提示唯一键冲突。所以可见本地表仍然保持了远程表的唯一键信息。

(6)在本地t_resource表中插入一条数据,避开前面几个冲突,成功插入

结果:远程t_resource表同步多了一条数据。

(7)测试的结论

跨库查询成功;

主键、外键和唯一键都保留了下来。但是新增时主键自增是从本地表的1开始,而不是接着远程表的id,造成新增时id冲突;

远程t_resource和本地t_resource的新增都会同步对方。

2017.9.15 postgres使用postgres_fdw实现跨库查询的更多相关文章

  1. 跨库查询(OpenDataSource)与链接服务器(Linking Server)

    一:跨库查询 Openrowset/opendatasource() is an ad-hoc method to access remote server's data. So, if you on ...

  2. mysql 跨库查询问题

    MySQL实现跨服务器查询 https://blog.csdn.net/LYK_for_dba/article/details/78180444 mysql> create database l ...

  3. 如何使用SQL SERVER数据库跨库查询

    SQL Server中内置了数据库跨库查询功能,下面简要介绍一下SQL Server跨库查询.首先打开数据源码:OPENDATASOURCE不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分 ...

  4. SqlServer跨库查询

    由于业务的拆分,数据库拆分为两种作用: 汇总数据库(Master,头节点数据库), 子节点数据库(Compute Node,计算子节点数据库) 这样,就设计到子节点访问头节点数据库中的某张汇总表,这种 ...

  5. ACCESS-如何多数据库查询(跨库查询)

    测试通过:ACCESSselect * from F:\MYk.mdb.tablename说明:1.查询语句2.来原于哪(没有密码是个路径)3.查询的表名 ====================== ...

  6. Access数据库跨库查询及记录集区分

    医疗设备软件一般都是单机软件,如果是Windows平台,常会选择Access数据库存储结构化数据,因为他轻量,便于部署.然而随着医疗信息化的发展,医生希望对多台单机设备的数据进行管理,采用网络数据库当 ...

  7. EF 跨库查询

    原因:最近公司项目,遇到一个ef跨库查询的问题.(只是跨库,并不是跨服务器哈) 主要我们的一些数据,譬如地址,城市需要查询公共资料库. 但是本身我的程序设计采用的是ef框架的.因此为这事花费了1天时间 ...

  8. SQL Server 跨库查询

    1. 开启Ad Hoc Distributed Queries组件,在sql查询编辑器中执行如下语句: reconfigure reconfigure 2. 跨库查询操作 select * from ...

  9. SQLServer跨库查询--分布式查询

    出处:http://www.cnblogs.com/doosmile/archive/2012/03/16/2400646.html --用openrowset连接远程SQL或插入数据 --如果只是临 ...

随机推荐

  1. mysql的乐观锁和悲观锁

    悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的 ...

  2. Codeforces 934.D A Determined Cleanup

    D. A Determined Cleanup time limit per test 1 second memory limit per test 256 megabytes input stand ...

  3. unicode 编码在线转换工具--javascript

    http://www.cnblogs.com/mq0036/p/4007452.html

  4. Python学习笔记(Django篇)——4、继续完善视图层

    在demo/views.py中添加这些代码: def detail(request, question_id): returnHttpResponse("You're looking at ...

  5. HTTP Basic 机制

    package com.enation.app.shop.component.payment.plugin.cod; import java.io.IOException; import java.u ...

  6. linux总结shell

    一.Shell脚本常用的头部格式: 头部的作用就是告知linux此脚本的类型: 常用的头部格式如下:(/bin/bash,是bash的路径,如果不知道路径可以通过which bash进行查看,其它命令 ...

  7. 【CF1017F】The Neutral Zone(Bitset,埃氏筛)

    题意: 思路:From https://blog.csdn.net/CSDNjiangshan/article/details/81536536 #include<cstdio> #inc ...

  8. 快速了解Android重要机制

    转自 http://www.jianshu.com/p/5f6d79323923 一.Android系统底层研究 关于底层的知识点不是在一篇文章中能讲解清楚,参见本人的Android底层研究系列,不断 ...

  9. 计算器的改良(纯字符串)o1

    原题传送门 这题比较水,就是细节..多了点. 首先字符串要处理好(废话..) 基础不行的话要多去看看书.. 然后捏,这题主要就是几个判断: 当我们读字符,如果读到运算符号,那么就要停下来,把之前的常数 ...

  10. mysql创建用户后无法登陆

    创建用户后登陆失败的原因是存在匿名用户: root@controller:~# mysql -h localhost -uaa -ppassword ERROR 1045 (28000): Acces ...