與postgresql_fdw功能類似,KINGBASE_FDW 是一種外部訪問接口,它可以被用來訪問存儲在外部的數據。想要使用fdw訪問數據需要先確保:網絡通,數據庫訪問配置(pg_hba,conf)正常,同時遠端數據庫的用戶必須有表的相關權限。
一、遠程數據庫
遠程數據庫 IP: 142 。創建用戶及測試數據:
create role user_remote with login; alter role user_remote with password 'user_remote'; create schema user_remote authorization user_remote; \c test user_remote create table t1(id integer,name varchar(9)); insert into t1 values(1,'a'),(2,'b');
二、本地數據庫
本地數據庫 IP: 143
1、創建擴展 kingbase_fdw
\c test system create role user_local with login; alter role user_local with password 'user_local'; create schema user_local authorization user_local; create extension kingbase_fdw;
擴展創建完成后,pg_foreign_data_wrapper 有如下一行:
test=# select * from pg_foreign_data_wrapper where fdwname='kingbase_fdw'; oid | fdwname | fdwowner | fdwhandler | fdwvalidator | fdwacl | fdwoptions -------+--------------+----------+------------+--------------+--------+------------ 16495 | kingbase_fdw | 10 | 16493 | 16494 | | (1 row)
2、create server
create server srv_42 foreign data wrapper kingbase_fdw options(host '192.168.237.42',port '54321',dbname 'test'); grant usage on foreign server srv_42 to user_local;
注意:必須將 Server 授權給用戶,否則用戶在創建外部表時,會報“ERROR: permission denied for foreign server srv_42” 錯誤。創建完server后,在sys_foreign_server 會有如下一條:
test=> select * from sys_foreign_server where srvname='srv_42'; oid | srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions -------+---------+----------+--------+---------+------------+---------------------------------------+---------------------------------------------- 16502 | srv_42 | 10 | 16495 | | | {system=U/system,user_local=U/system} | {host=192.168.237.42,port=54321,dbname=test} (1 row)
3、創建user mapping
create user mapping for user_local server srv_42 options(user 'user_remote',password 'user_remote');
創建后,在pg_user_mappings 會有一條記錄:
test=> select * from pg_user_mappings where srvname='srv_42'; umid | srvid | srvname | umuser | usename | umoptions -------+-------+---------+--------+------------+----------------------------------------- 16503 | 16502 | srv_42 | 16500 | user_local | {user=user_remote,password=user_remote}
4、創建外部表
create foreign table ft_t1 ( id integer , name varchar(9) ) server srv_42 options (schema_name 'user_remote',table_name 't1');
5、訪問測試
test=> \d List of relations Schema | Name | Type | Owner ------------+-------+---------------+------------ user_local | ft_t1 | foreign table | user_local (1 row) test=> select * from ft_t1; id | name ----+----------- 1 | a 2 | b (2 rows)
6、選擇導入遠程的整個schema
可以將遠程schema下的所有表及視圖通過import 方式導入,避免逐表創建。
test=> import foreign schema user_remote from server srv_42 into user_local; IMPORT FOREIGN SCHEMA test=> \d List of relations Schema | Name | Type | Owner ------------+------+---------------+------------ user_local | t1 | foreign table | user_local user_local | t2 | foreign table | user_local