PostgreSQL触发器数据同步

ops/2024/10/30 20:13:25/

背景

ctm02brss同步数据应用提供标准的视图库,支持把第三方的组织,人员,人脸数据同步到海康EBG的平台上

主要关键数据

组织:代表学校组织架构,如学院、专业、班级等,教师需在非班级节点,学生必须在班级节点上

人员:包含教职工和学生

人脸:教职工和学生的人脸信息

对接方式

常见的对接方式一般分为三种

1、第三方只提供数据库,我们则需要通过编写视图SQL的形式在第三方数据库上建立ctm02brss支持的标准视图

2、第三方只提供接口,我们则需要通过HDI或者定制程序的方式,把数据同步到我们的标准PG库中

3、第三方做开发,直接把标准数据推到我们标准的PG库中

广西XXX大学人员同步

广西XXX大学属于第三种对接方式,同时还需要在该方式的基础上加上触发器做数据清理

以上是XXX大学创建的中间库表,tb_middle_xxx属于标准的ctm02brss支持的中间库表,tb_temp_xxx属于临时中间库表

例如需要同步中XX大学的XXX学院教师信息表,字段如下

我们则需要创建一张对应的临时表tb_temp_science_teacher

CREATE TABLE public.tb_temp_science_teacher (zgh varchar NULL, -- 职工号xm varchar NULL, -- 姓名xb varchar NULL, -- 性别sfzjlxdm varchar NULL, -- 身份证件类型代码sfzjlxmc varchar NULL, -- 身份证件类型名称sfzh varchar NULL, -- 身份证号dwdm varchar NULL, -- 单位代码dwmc varchar NULL, -- 单位名称dqztdm varchar NULL, -- 当前状态代码dqztmc varchar NULL, -- 当前状态名称sjh varchar NULL -- 手机号
);
COMMENT ON TABLE public.tb_temp_science_teacher IS '赛恩斯学院教师信息临时表';COMMENT ON COLUMN public.tb_temp_science_teacher.zgh IS '职工号';
COMMENT ON COLUMN public.tb_temp_science_teacher.xm IS '姓名';
COMMENT ON COLUMN public.tb_temp_science_teacher.xb IS '性别';
COMMENT ON COLUMN public.tb_temp_science_teacher.sfzjlxdm IS '身份证件类型代码';
COMMENT ON COLUMN public.tb_temp_science_teacher.sfzjlxmc IS '身份证件类型名称';
COMMENT ON COLUMN public.tb_temp_science_teacher.sfzh IS '身份证号';
COMMENT ON COLUMN public.tb_temp_science_teacher.dwdm IS '单位代码';
COMMENT ON COLUMN public.tb_temp_science_teacher.dwmc IS '单位名称';
COMMENT ON COLUMN public.tb_temp_science_teacher.dqztdm IS '当前状态代码';
COMMENT ON COLUMN public.tb_temp_science_teacher.dqztmc IS '当前状态名称';
COMMENT ON COLUMN public.tb_temp_science_teacher.sjh IS '手机号';

同时编写触发器,每当tb_temp_science_teacher插入一条数据,就通过触发器把人移到对应的组织目录之下

--删除赛恩斯学院教职工临时表触发器
drop trigger if exists trigger_tb_temp_science_teacher on public.tb_temp_science_teacher;
--删除赛恩斯学院教职工临时表存储过程
drop function if exists public.procedure_tb_temp_science_teacher();
--创建赛恩斯学院教职工临时表存储过程
create or replace function public.procedure_tb_temp_science_teacher() returns trigger as $BODY$declarev_org_id varchar;begincase when TRIM(NEW.dwmc) = '广西XXX大学赛恩斯新医药学院' then v_org_id := 'gxzyydxsesxyyxy' || 'ScienceTeacherOrgNode';when TRIM(NEW.dwmc) = '赛院学工处' then v_org_id := 'saiyuanxuegongchu' || 'ScienceTeacherOrgNode';when TRIM(NEW.dwmc) = '学工处' then v_org_id := 'xuegonchu' || 'ScienceTeacherOrgNode';when TRIM(NEW.dwmc) = '专职辅导员' then v_org_id := 'zhuanzhifudaoyuan' || 'ScienceTeacherOrgNode'; else v_org_id := 'other' || 'ScienceTeacherOrgNode';   end case;      --插入赛恩斯教职工组织新根节点insert into public.tb_middle_org (org_id, org_name, parent_org_id, status, org_type, update_time) values ('scienceTeacherOrgNode', '赛恩斯教职工组织新', 'RootOrgNode', 0, 1, current_timestamp) on conflict(org_id) do nothing;--插入教师所属组织节点insert into public.tb_middle_org (org_id, org_name, parent_org_id, status, org_type, update_time) values (v_org_id, NEW.dwmc, 'scienceTeacherOrgNode', 0, 1, current_timestamp) on conflict(org_id) do nothing;--更新赛恩斯学院教职工insert into public.tb_middle_person (job_no, name, person_type, sex, org_id, mobile, cert_type, certificate_no, status, update_time)values (NEW.zgh,NEW.xm,1,case when NEW.xb = '男' then 1 when NEW.xb = '女' then 2 else 0 end,v_org_id,NEW.sjh,case when NEW.sfzjlxmc = '身份证' then 111 else 990 end,NEW.sfzh,0,current_timestamp)on conflict(job_no) do updatesetname = NEW.xm,person_type = 1,sex = (case when NEW.xb = '男' then 1 when NEW.xb = '女' then 2 else 0 end),org_id = v_org_id,mobile = NEW.sjh,cert_type = (case when NEW.sfzjlxmc = '身份证' then 111 else 990 end),certificate_no = NEW.sfzh,status = 0,update_time = current_timestamp;return null;end;
$BODY$ language plpgsql;
--创建赛恩斯学院教职工临时表触发器
create trigger trigger_tb_temp_science_teacher after insert or update on public.tb_temp_science_teacher for each row execute procedure public.procedure_tb_temp_science_teacher();

触发器释义

1、先判断插入该人员的组织是否存在,存在则赋值对应的组织id,不存在则创建对应的组织节点

2、把临时表中的数据字段和标准视图的字段一一对应上,同时编写异常情况下处理的逻辑

3、把触发器和临时表绑定

在XXX的etl平台上开始推送数据

组织和人员选择增量同步,我们的平台上即可产生对应的组织目录


http://www.ppmy.cn/ops/129688.html

相关文章

安装git-lfs发生报错Could not find Git; can not register Git LFS.解决方案

解决方案: 步骤1.安装Github-Deskop Download GitHub Desktop | GitHub Desktophttps://desktop.github.com/download/ 步骤2.安装 Git! Git for WindowsWe bring the awesome Git VCS to Windowshttps://gitforwindows.org/ 这两个安装完成之后即可…

配置和排查 Lombok 在 IDEA 中使用的详细步骤

在日常开发中,Java 代码常常需要大量的样板代码,比如 getter、setter、toString 等方法。Lombok 是一个 Java 库,可以通过注解的方式,自动生成这些常见的代码,从而让代码更加简洁、清晰。比如,我们可以通过…

OOP 一些例题

例题一 #include <iostream> using namespace std;class Animal { public:Animal(string name) :name_(name) {}virtual void bark() 0; protected:string getName() { return name_; } private:string name_; };class Cat : public Animal { public:Cat(string name) …

MFC图形函数学习04——画矩形函数

MFC中绘制矩形函数是MFC的基本绘图函数&#xff0c;它的大小和位置由左上角和右下角的坐标决定&#xff1b;若想绘制的矩形边框线型、线宽、颜色以及填充颜色都还需要其它函数的配合。 一、绘制矩形函数 原型&#xff1a;BOOL Rectangle(int x1,int y1,int x2,int y2); …

分别用webpack和vite注册全局组件

基础组件的自动化全局注册 1. 组件全部导入后&#xff0c;批量注册 import dgDialog from "/components/dgDialog/index.vue"; import svgIcon from "/components/svgIcon/index.vue"; const allComponent { dgDialog, svgIcon }; export default {inst…

Python实现基于WebSocket的stomp协议调试助手工具

stomp协议很简单&#xff0c;但是搜遍网络竟没找到一款合适的客户端工具。大多数提供的都是客户端库的使用。可能是太简单了吧&#xff01;可是即便这样&#xff0c;假如有一可视化的工具&#xff0c;将方便的对stomp协议进行抓包调试。网上类似MQTT的客户端工具有很多&#xf…

如何从iconfont中获取字体图标并应用到微信小程序中去?

下面我们一一个微信小程序的登录界面的制作为例来说明&#xff0c;如何从iconfont中获取字体图标是如何应用到微信小程序中去的。首先我们看效果。 这里所有的图标&#xff0c;都是从iconfont中以字体的形式来加载的&#xff0c;也就是说&#xff0c;我们自始至终没有使用一张…

工具_Nginx

文章目录 location语法介绍跨域配置https配置http重定向到https配置反向代理配置负载均衡配置upstream配置负载均衡算法&#xff08;1&#xff09;rr轮询&#xff08;默认&#xff09;&#xff08;2&#xff09;wrr加权轮询&#xff08;weight&#xff09;&#xff08;3&#x…