首先声明,我是从MSSQL阵营刚入PostgreSQL阵营的。转营这几天来,深感这些年来被MSSQL坑害不浅!
进入正题,在MSSQL中,跨数据库(相同服务器或不同服务器的都算)查询可以轻松使用select * from otherdb.dbo.mytable(相同服务器中的不同数据库)或select * from otherserver.otherdb.dbo.mytable(不同服务器中的不同数据库,其中otherserver是个链接服务器)完成,甚是方便!
这几天使用PostgreSQL的时候,突然发现需要在PostgreSQL中实现跨库查询,本以为可以使用类似"数据库.数据表"的方式完成呢,结果失败了……从网上查了下,知道PostgreSQL中需要使用dblink函数实现跨库或跨服务器查询,据说是仿照着Oracle的dblink做的,挺好,试着配置了下,把配置过程详细地下出来,供大家参考。
1、安装dblink扩展
LInux下可以参考:
《PostgreSQL的小技巧》
http://tieba.baidu.com/f?kz=163201318#
Windows下可以参考:
《Windows环境下配置PostgreSql的dblink功能》
http://blog.csdn.net/lr2651/article/details/1375769
注意,我用的是PostgreSQL9.1版的,使用psql -d mydb -f dblink--1.0.sql的时候不成功,说是: Use "CREATE EXTENSION dblink" to load this file.
后来,干脆使用 psql -d mydb -U lslxdx
输入密码后,进入plsql的shell里,在这里边输入 CREATE EXTENSION dblink;
返回 CREATE EXTENSION表示成功。
2、使用dblink
进入pgAdmin里的Query窗口,执行:
select * into stu from dblink('host=127.0.0.1 dbname=postgres user=lslxdx password=123456','select * from stu') as stu(sid int,sno varchar(32),sname varchar(64));就可以在别的mydb查询postgres库里的东西啦~
dblink的使用可以参考:
a.《关于PostgreSQL跨库查询的问题》
http://topic.csdn.net/u/20100203/14/def81dd8-e6cc-4524-867d-6f4b6f99836c.html
b.《PostgreSQL 8.3.17 Documentation》
http://www.postgresql.org/docs/8.3/static/contrib-dblink.html
3、注意
执行
psql -d mydb时,默认的登陆用户名(username)是计算机的用户名,比如,我的是leesonlog,如果数据库里没有这个用户名,那么在之后的输入密码阶段,肯定是过不去的,所以,应该使用 psql -d mydb -U lslxdx-U参数可以加数据库的登陆名。使用psql可以进入plsql的shell,或者也可以直接从开始菜单中PostgreSQL程序组里双击“SQL Shell (psql)”,然后一路回车,直接进入plsql的shell我把“C:\Program Files\PostgreSQL\9.1\bin”直接加到环境变量的path里了,所以可以直接在任何目录输入psql,否则就需要进入“C:\Program Files\PostgreSQL\9.1\bin”才能执行psql。在PostgreSQL9.1版中,dblink.sql放在“C:\Program Files\PostgreSQL\9.1\share\extension”文件夹中,而且名字叫“dblink--1.0.sql”,执行“psql -d mydb -f dblink--1.0.sql”时,要指定dblink.sql的文件路径(相对或绝对)。