PostgreSQL利用FDW实现简易dblink

1、介绍

Oracle DATABASE LINK可以访问其他数据库(实例)的对象,使用简单而且方便,很多现有应用会涉及到它。

 

2、常见用法

远程表

SELECT col_list FROM table_remote@dblink;程序列

远程序列

SELECT seq_remote.nextval@dblink FROM dual;

如果应用中不少地方用到它,或者说面临很多这类应用,而我们又希望尽量少的改动应用,这里给大家展示一个简单修改PG的办法应对,简化起见先说说表。

 

3、远程表语法table_remote@dblink

这个格式有一个明显的问题:@是PG里常见的操作符(或者部分),搜一下:

SELECT oprname FROM pg_operator WHERE oprname like '%@%';

多少个?60,直接是 @ 本身的就有17个之多。

4、表访问FROM子句

我们来看FROM子句语法(节选自gram.y)

from_clause:
      FROM from_list              { $$ = $2; }
      | /*EMPTY*/               { $$ = NIL; }
    ;
​
from_list:
      table_ref               { $$ = list_make1($1); }
      | from_list ',' table_ref       { $$ = lappend($1, $3); }
    ;
​
/*
 * table_ref is where an alias clause can be attached.
 */
table_ref:  relation_expr opt_alias_clause
        {
          $1->alias = $2;
          $$ = (Node *) $1;
        }
...(略)
relation_expr:
      qualified_name
        {
          /* inheritance query, implicitly */
          $$ = $1;
          $$->inh = true;
          $$->alias = NULL;
        }

这里的语法还会影响到INSERT、CURSOR 等等,因为只是演示,我们就不去评估对它们的影响。

5、创建FDW

CREATE SERVER myserver FOREIGN DATA WRAPPER postgres_fdw
  OPTIONS (host 'foo', dbname 'foodb', port '5432');
​
CREATE SCHEMA myserver;
CREATE FOREIGN TABLE myserver.films (
    code        char(5) NOT NULL,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
)
SERVER myserver;

这里只是举个例子,实际上采用什么样的命名规则完全可以随意选择,只要跟当前应用要求的数据结构不冲突即可。

6、把语法映射成为外部表访问

relation_expr:
      qualified_name
        {
          /* inheritance query, implicitly */
          $$ = $1;
          $$->inh = true;
          $$->alias = NULL;
        }
      | qualified_name Op IDENT
        {
          /* inheritance query, implicitly */
          $$ = $1;
          $$->inh = true;
          $$->schemaname = $3;
          $$->alias = NULL;
        }

这里应该检查 Op 是不是 @,不然任何操作符都可以。

7、访问

SELECT * FROM films@myserver;

其实它相当于:

SELECT * FROM myserver.films;

这样小小的改动,可能给应用开发人员减少一些修改代码的苦处。

8、其它

修改语法的麻烦在于,我们需要确认它的影响范围,简单办法是回归测试,如果可以通过,至少证明我们没有影响PG原有功能。上边我们提到了远程序列,它要更麻烦些,因为只是演示,也就不一一说明。并且我们也只是考虑了FROM子句中的实现,其他部分呢?

此外显而易见,DBA的维护工作会增多。

9、增强

如果只是某些表需要远程访问,这种方式无疑还是可以接受的,如果某个系统需要访问几百张远程表,就算可以用脚本自动创建,显然也不是件美妙的事情。如果表结构发生修改呢?所以这里自动创建是个好的选择,如果每次访问自动创建,又会面临系统空间膨胀问题(跟临时表一个道理),定义一个刷新策略可以缓解。根本解决办法是用临时数据源,这个改动很有趣。

10、最后

以上都是些随便写写然后简单验证的东西,拿来玩玩可以,我个人绝对没有给你用在生产环境的勇气,请谨慎。

转载于:https://my.oschina.net/quanzl/blog/3070615

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值