PostgreSQL如何利用FDW实现简易dblink
这篇文章主要讲解了"PostgreSQL如何利用FDW实现简易dblink",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"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、增强
如果只是某些表需要远程访问,这种方式无疑还是可以接受的,如果某个系统需要访问几百张远程表,就算可以用脚本自动创建,显然也不是件美妙的事情。如果表结构发生修改呢?所以这里自动创建是个好的选择,如果每次访问自动创建,又会面临系统空间膨胀问题(跟临时表一个道理),定义一个刷新策略可以缓解。根本解决办法是用临时数据源,这个改动很有趣。
感谢各位的阅读,以上就是"PostgreSQL如何利用FDW实现简易dblink"的内容了,经过本文的学习后,相信大家对PostgreSQL如何利用FDW实现简易dblink这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!