基于alibaba druid的血缘解析工具

基于alibaba druid的血缘解析

1、前言

SQL血缘解析指的是通过sql语句来分析该语句中表与表之间的依赖关系和字段和字段之间的依赖关系。

本血缘解析工具仅仅对mysql数据库的select查询语句进行了血缘解析(后续会持续扩展),该血缘解析包含了原始表字段、临时表字段和目标表字段的关联关系。

2、涉及到技术

主要使用了druid对sql的语法进行解析,涉及到的语法解析接口如下:

(1)SQLStatement

该接口定义了数据库DML(insert、update、delete)和DQL(select)的相关规范。

  • SQLSelectStatement
(2)sqlselectquery

改接口可分为联合查询和单表查询两种类型,通过该阶段可以获得字段信息(包括字段名、字段别名、字段所属表:通过sqlexpr获取)和字段来源信息即SQLTableSource

  • SQLUnionQuery
    表示sql为 联合查询,例如:
select name from student union select name from employees; 
  • SQLSelectQueryBlock
    表示sql为单表查询,例如:
select * from student;
  • MySqlSelectQueryBlock
    表示sql为单表查询,例如:
select * from student;
(3)SQLTableSource

通过sqlselectquery的from方法获取,有如下形式:

  • SQLExprTableSource
    表示from后面是一个真实的表名(非虚拟表),可以理解为该类表示单表查询。在sql解析中可以在该类中获取sql中真实的表名(sql语句若干单表查询的终结类)。例如:
select name from student
  • SQLJoinTableSource
    表示from后面是一个join的关联查询,例如:
selec * from student s left join employees e on s.id = e.id; 
  • SQLSubqueryTableSource
    表示from后面是一个子查询,例如:
select * from (select id, name from student)s
  • SQLUnionQueryTableSource
    表示from后面是一个联合查询,例如:
select name from (select name from student union select name from employees)
(4)sqlexpr
  • SQLAggregateExpr
  • SQLAllColumnExpr
  • SQLIdentifierExpr
  • SQLPropertyExpr
  • SQLQueryExpr

3、成果展示

主要和datablau血缘解析工具进行对比
(1)select语句中包含关联查询和字段中包含子查询

SELECTe.employee_id,e.name,e.gender,e.date_of_birth,e.date_of_hire,d.department_name,ts.total_salary,b.bonus,(SELECTB.id,B.CGFS,B.WLZ,B.CPMC,B.CGSL,B.ZXCJ,B.ZXJE,B.HTGLXTHTH,B.CGPZH,B.WZBM,B.HSZJ,B.BEDNR JHBH,B.WCXTCGDDID,B.ZHTDAT,D.WERKS_NAME XQGCMC,D.WERKS XQGCBMFROM(SELECTA.id,A.ZCGFS CGFS,A.MATKL WLZ,A.TXZ01 CPMC,A.MENGE CGSL,A.NAME1 ZXCJ,A.ZHSDJ ZXJE,A.ZHTNUM HTGLXTHTH,A.EBELN CGPZH,A.MATNR WZBM,A.ZHSZJ HSZJ,A.ZHTDAT,C.EMATN,C.BEDNR,C.ZCGDDID WCXTCGDDIDFROMTB_ERP_ZP11MMRP008 A,TB_ERP_ME2M CWHEREA.EBELN = C.EBELNand A.MATNR = C.EMATN) B,TB_ERP_ZP10MMDG030 DWHEREB.BEDNR = D.BEDNRAND B.EMATN = D.MATNRand B.ZHTDAT > to_date('2023/05/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')) as sfs,(selects.dfromstudent swherestudent_id = e.employee_id) as saf12
FROMemployee eINNER JOIN department d ON e.department_id = d.department_idINNER JOIN tmp_salary ts ON e.employee_id = ts.employee_idLEFT OUTER JOIN bonus b ON e.employee_id = b.employee_id;

本血缘解析工具分析结果:

-- TB_ERP_ZP11MMRP008.NAME1 -> B.ZXCJ -> SELECT_STATEMENT_2.ZXCJ -> SELECT_STATEMENT_0.sfs
-- employee.date_of_birth -> SELECT_STATEMENT_0.date_of_birth
-- TB_ERP_ZP11MMRP008.ZHTDAT -> B.ZHTDAT -> SELECT_STATEMENT_2.ZHTDAT -> SELECT_STATEMENT_0.sfs
-- department.department_name -> SELECT_STATEMENT_0.department_name
-- bonus.bonus -> SELECT_STATEMENT_0.bonus
-- student.d -> SELECT_STATEMENT_5.d -> SELECT_STATEMENT_0.saf12
-- TB_ERP_ZP11MMRP008.MATNR -> B.WZBM -> SELECT_STATEMENT_2.WZBM -> SELECT_STATEMENT_0.sfs
-- TB_ERP_ZP11MMRP008.EBELN -> B.CGPZH -> SELECT_STATEMENT_2.CGPZH -> SELECT_STATEMENT_0.sfs
-- employee.name -> SELECT_STATEMENT_0.name
-- TB_ERP_ZP11MMRP008.ZHTNUM -> B.HTGLXTHTH -> SELECT_STATEMENT_2.HTGLXTHTH -> SELECT_STATEMENT_0.sfs
-- TB_ERP_ZP11MMRP008.MATKL -> B.WLZ -> SELECT_STATEMENT_2.WLZ -> SELECT_STATEMENT_0.sfs
-- TB_ERP_ZP10MMDG030.WERKS -> SELECT_STATEMENT_2.XQGCBM -> SELECT_STATEMENT_0.sfs
-- TB_ERP_ZP11MMRP008.ZCGFS -> B.CGFS -> SELECT_STATEMENT_2.CGFS -> SELECT_STATEMENT_0.sfs
-- TB_ERP_ZP11MMRP008.MENGE -> B.CGSL -> SELECT_STATEMENT_2.CGSL -> SELECT_STATEMENT_0.sfs
-- employee.gender -> SELECT_STATEMENT_0.gender
-- TB_ERP_ZP11MMRP008.TXZ01 -> B.CPMC -> SELECT_STATEMENT_2.CPMC -> SELECT_STATEMENT_0.sfs
-- TB_ERP_ZP11MMRP008.id -> B.id -> SELECT_STATEMENT_2.id -> SELECT_STATEMENT_0.sfs
-- tmp_salary.total_salary -> SELECT_STATEMENT_0.total_salary
-- TB_ERP_ZP11MMRP008.ZHSZJ -> B.HSZJ -> SELECT_STATEMENT_2.HSZJ -> SELECT_STATEMENT_0.sfs
-- TB_ERP_ME2M.ZCGDDID -> B.WCXTCGDDID -> SELECT_STATEMENT_2.WCXTCGDDID -> SELECT_STATEMENT_0.sfs
-- TB_ERP_ZP11MMRP008.ZHSDJ -> B.ZXJE -> SELECT_STATEMENT_2.ZXJE -> SELECT_STATEMENT_0.sfs
-- TB_ERP_ME2M.EMATN -> B.EMATN
-- TB_ERP_ME2M.BEDNR -> B.BEDNR -> SELECT_STATEMENT_2.JHBH -> SELECT_STATEMENT_0.sfs
-- employee.date_of_hire -> SELECT_STATEMENT_0.date_of_hire
-- employee.employee_id -> SELECT_STATEMENT_0.employee_id
-- TB_ERP_ZP10MMDG030.WERKS_NAME -> SELECT_STATEMENT_2.XQGCMC -> SELECT_STATEMENT_0.sfs

datablua血缘解析工具结果:
在这里插入图片描述
(2)select联合查询

select s.id from student s union select e.id from employees e

本血缘解析工具分析结果:

-- student.id -> SELECT_STATEMENT_0.id
-- employees.id -> SELECT_STATEMENT_1.id

datablua血缘解析工具结果:
在这里插入图片描述

4 待优化点

  • 不支持没有别名的select查询
  • 联合查询没有结果汇总,有待优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/296057.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【接口测试】Postman(三)-变量与集合

一、变量 ​ 变量这个概念相信大家都不陌生,因此在这里我们不介绍了。主要说一下在Postman中有哪几类变量,主要包括以下四类: Global(全局) Environment(环境) Local(本地&#xf…

STM32实现流水灯

led.c #include"led.h"void Led_Init(void) {GPIO_InitTypeDef GPIO_VALUE; //???RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//???GPIO_VALUE.GPIO_ModeGPIO_Mode_Out_PP;//???? ????GPIO_VALUE.GPIO_PinGPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_…

分布式Session使用步骤

目录 1. 为什么用分布式Session2. Spring-Session使用步骤2-1. 添加依赖2-2. yml配置 1. 为什么用分布式Session 将一个项目部署到多台服务器上时,多台服务器的Tomcat的Session不共享。那么就有可能造成Session数据不一致情况,所以此时就需要使用分布式…

网络基础知识制作网线了解、集线器、交换机与路由器

目录 一、网线的制作 1.1、材料 1.2、网线的标准类别 二、集线器、交换机介绍 2.1、概念: 2.2、OSI七层模型 2.3、TCP/IP四层 三、路由器的配置 3.1、概念 3.2、四个模块 1、 网络状态 2、设备管理 3、应用管理 无人设备接入控制 无线桥接 信号调节…

并发踩坑:list共享变量的addAll

背景: 某业务报错了,提示:Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.util.ConcurrentModificationException 分析: 这是执行查询时报的 并发修改异常。大概逻辑…

设计模式(3)--对象结构(7)--代理

1. 意图 为其它对象提供一种代理以控制对这个对象的访问。 2. 三种角色 抽象实体(Subject)、真实实体(RealSubject)、代理(Proxy) 3. 优点 3.1 远程代理可以隐藏一个对象存在于不同地址空间的事实。 3.2 虚拟代理可以进行最优化。 3.3 保护代理和智能引用都允许在访问对象时有…

HarmonyOS4.0系统性深入开发02 UIAbility组件详解(上)

UIAbility组件概述 概述 UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。 UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实例…

Blazor 混合开发_MAUI+Vue_WPF+Vue

Blazor 混合开发_MAUIVue_WPFVue 背景混合开发的核心为什么必须使用 wwwroot 文件夹放置 Web 项目文件 创建 MAUI 项目创建 wwwroot 文件夹服务注册创建 _import.razor添加 Main.razor 组件修改 MainPage.xaml 文件 创建 WPF 项目创建 wwwroot 文件夹服务注册创建 _import.razo…

使用 pytest.ini 文件控制输出 log 日志

一、前置说明 pytest.ini 文件中可以配置参数来控制 pytest 的运行行为,其存放路径要求与 conftest.py 一样。 项目根目录project_root/ ├── pytest.ini ├── tests/ │ └── test_demo.py以test开头的测试子目录project_root/ ├── tests/ │ ├── pytest.in…

一文详解SpringBoot 定时任务(cron表达式)

IDE:IntelliJ IDEA 2022.2.3 x64 操作系统:win10 x64 位 家庭版 JDK: 1.8 文章目录 一、如何开启一个SpringBoot定时任务?二、cron表达式详解2.1 语法格式2.2 符号解析2,2.1 通用符号: , - * /2.2.2 专有符号:?L w 2.3…

STM32——CAN协议

文章目录 一.CAN协议的基本特点1.1 特点1.2 电平标准1.3 基本的五个帧1.4 数据帧 二.数据帧解析2.1 帧起始和仲裁段2.2 控制段2.3 数据段和CRC段2.4 ACK段和帧结束 三.总线仲裁四.位时序五.STM32CAN控制器原理与配置5.1 STM32CAN控制器介绍5.2 CAN的模式5.3 CAN框图 六 手册寄存…

智能优化算法应用:基于材料生成算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于材料生成算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于材料生成算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.材料生成算法4.实验参数设定5.算法结果6.…