PostgreSQL如何利用FDW实现简易dblink

这篇文章主要讲解了“PostgreSQL如何利用FDW实现简易dblink”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL如何利用FDW实现简易dblink”吧!

创新互联建站长期为数千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为灵石企业提供专业的成都网站建设、成都网站设计,灵石网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。

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子句中的实现,其他部分呢?

PostgreSQL如何利用FDW实现简易dblink

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

9、增强

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

感谢各位的阅读,以上就是“PostgreSQL如何利用FDW实现简易dblink”的内容了,经过本文的学习后,相信大家对PostgreSQL如何利用FDW实现简易dblink这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


当前名称:PostgreSQL如何利用FDW实现简易dblink
本文来源:http://scyanting.com/article/gshcec.html