postgis mysql_PostGIS mysql_fdw使用(Linux)

##前文讲了mysql_fdw的安装,此文主要讲mysql_fdw的配置以及使用

背景需求

业务平台数据库用的是MySQL,地图引擎用的是ArcGIS,ArcSDE不支持MySQL作为空间数据库,因此我们将空间数据库搭在了PostgreSQL上。

考虑到业务信息与空间信息没法完全划分出界限(即不排除Mysql会存入有待分析的空间数据,PostgreSQL需要将空间数据推到业务端),所以想将两库做同步,并能在ArcMap中进行关联。

讨论了多套方案:有通过接口进行同步;定时服务同步;以及这里提及的MySQL_fdw外部数据封装包。这里记录mysql_fdw的研究成果。

前期准备

因为最终目的需要使ArcSDE能连接库,因此首先还是要在ArcMap中创建企业级空间数据库,不会的参考之前博文链接(方法二):https://www.cnblogs.com/giser-s/p/10345285.html

配置使用

1.资源约定

##先做约定,后面示例用的资源如下

##用户:sde

##空间数据库名称:bkrq

##空间数据表名称:user_role

##Server名称:bkrq_server

##Mysql数据源:

地址:10.19.147.**

账号/密码:root / pwd123

数据库:bkrq

表名:user_role

2.超级账号登陆bkrq库

[root@localhost ~]#  su - postgres

-bash-4.2$ psql

postgres=#  \c bkrq

5fde82e1fcabb6985d965f15a9f890d7.png

3.创建扩展

bkrq=#CREATE EXTENSION mysql_fdw;

7391e9aab2046eee8ac8757af7e1d4a4.png

4.创建外部服务器Server

#超级用户执行(这里用postgres)

#替换成mysql的真实IP和端口

bkrq=# CREATE SERVER bkrq_server

FOREIGN DATA WRAPPER mysql_fdw

OPTIONS (host '10.19.147.**', port '3306');

fc9c5cef82891359fc56eb46f6c8b354.png

5.创建映射Mapping

#超级用户执行(这里用postgres)

#pguser 替换成需要查询MYSQL表的PG数据库普通用户

bkrq=# CREATE USER MAPPING FOR sde

SERVER bkrq_server

OPTIONS (username 'root', password 'pwd123');

2b9581e6905f0b00d0a7cdd3a288c0cc.png

6.赋权限

#超级用户执行(这里用postgres)

#pguser 替换成需要查询MYSQL表的PG数据库普通用户

#这里sde默认创建时已经是超级用户,这步非必要

bkrq=#  grant usage ON FOREIGN SERVER bkrq_server to sde;

074477a6598a3ccb85768e5d0ea24585.png

7.切换用户/库

#普通用户执行(切换到sde用户,库bkrq不变)

#创建与mysql结构一样的表, 参数中指定表名和库名

bkrq=#  \c bkrq sde;

e65c1f03a35842c41ae47589f8126aa4.png

8.创建外部表

#普通用户执行(sde用户,bkrq库)

#创建外部表(与Mysql同步表,表名、表结构保持一致)

######建表时标红处为mysql表,注意区分大小写#######

bkrq=#  CREATE FOREIGN TABLE USER_ROLE(

ROLE_ID int,

ROLE_NAME text,

ROLE_TXT text,

MENU_ID text)

SERVER bkrq_server

OPTIONS (dbname 'bkrq', table_name 'USER_ROLE');

8a2598fbd14aed193f95aa57ef0ce6be.png

9.插入测试

#普通用户执行(sde用户,bkrq库)

#支持写MYSQL远程表, 如果要回收写权限,建议使用超级用户建foreign table,并且将select权限赋予给普通用户。

bkrq=#  INSERT INTO user_role values (1, '2',’3’,’4’);

10.Mysql_fdw结束

查看mysql表与pg表,刚才插入的数据是否执行成功即可。至此,Mysql_fdw的配置和使用结束。

但是,因为ArcGIS的介入,配置还没有结束!

fdw同步的数据都会存在外部数据表中,与一般的普通表不同(具体区别自行百度),ArcSDE不识别,ArcMap里编辑的就无法同步到MySQL,无奈只能想到用触发器的方式实现。

#外部数据表在pgAdmin中查看方法。文件--选项--浏览器--外部数据表。

91e43b8d3b30222aad4f309ca04a5c44.png

#彩蛋:这里搜到foreign_table_exposer.fdw,这个扩展的介绍说明就是将外部表转为普通表,但好像版本比较高,我9.4编译失败,大家可以试试

1e6360c52e91e6429e3412e551bb3898.png

10.新建表

#

bkrq=#  CREATE TABLE tab_act_user_role(ROLE_ID int,ROLE_NAME text,ROLE_TXT text,MENU_ID text);

11.新建函数/过程

#新增auditlogfunc的函数过程,实现触发器触发时,更新user_role外部表

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$

BEGIN

if (TG_OP = 'DELETE') then

delete from user_role where ROLE_ID = OLD.ROLE_ID;

return old;

elsif (TG_OP = 'UPDATE') then

update user_role set ROLE_NAME = new.ROLE_NAME , ROLE_TXT = new.ROLE_TXT , MENU_ID = new.MENU_ID where ROLE_ID = OLD.ROLE_ID;

return new;

elsif (TG_OP = 'INSERT') then

insert into user_role select new.*;

return new;

end if;

return null;

END;

$example_table$ LANGUAGE plpgsql;

12.新建触发器

#为内部表tab_act_user_role添加增删改查的触发器

CREATE TRIGGER example_trigger AFTER INSERT or UPDATE or DELETE ON tab_act_user_role

FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

13.测试

insert into tab_act_user_role values (111112,'2','2','2');

delete from tab_act_user_role where role_id = 111112;

update tab_act_user_role set role_name ='2222' where role_id = '111111';

#操作tab_act_user_role表时,如果user_role外部表数据有更新,则表示成功!

select * from user_role;

#遇到过下面的错误,在建表的时候Mysql的表一定要设主键

cb54996eb81f51319c66ff2780ae73fe.png

13.结束

完结撒花

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值