数据治理中Oracle SQL和存储过程的数据血缘分析

 

数据治理中的一个重要基础工作是分析组织中数据的血缘关系。有了完整的数据血缘关系,我们可以用它进行数据溯源、表和字段变更的影响分析、数据合规性的证明、数据质量的检查等。

分析数据血缘的方法主要分为四类

  • 自动解析
  • 系统跟踪
  • 机器学习
  • 人工收集

自动解析主要是利用工具解析 SQL 语句、存储过程和 ETL等文件。 本文以 Oracle 为例,来说明如何分析 SQL 和存储过程中的数据血缘。

产生数据血缘的 SQL 语句

  • SELECT
  • INSERT
  • UPDATE
  • MERGE
  • CREATE VIEW
  • CREATE TABLE
  • 存储过程

SELECT

可能你会感到奇怪, SELECT 语句没有对数据进行增、改操作,如何会产生数据血缘? 秘密就在于 SELECT 语句中的 select list 部分,在这里,可以对数据进行转换。 以下面这个 SELECT 语句为例:

select  sal + commission as totalSal
from emp;

我们可以看到,totalSal 字段的数据来自 emp.sal 和 emp.commission,在这里,数据进行了一次转换。 这种在 SELECT 内部产生的数据血缘是临时性的,但是这个 SELECT 语句和 CREATE VIEW 或者 CREATE TABLE 一结合,这个数据血缘就真正落地形成了。例如:

create view v_sal(mySal)
as
select sal + commission as totalSal
from emp;

这个 CREATE VIEW 语句通过 SELECT 形成了 从 emp.sal 和 emp.commission 到 v_sal.mySal 的数据血缘。

因此我们可以知道,分析好 SELECT 语句是对 SQL 语句进行数据血缘分析的基础。总体来说,通过分析 SQL 语句来获得数据血缘是比较直观和简单的,但问题的关键是人工分析的效率太低,对于企业内众多的 SQL 来说,人工分析基本是不可能的。

存储过程

存储过程可以包含比较复杂的逻辑处理,例如条件判断、循环分支等。因此常用来完成数据抽取、转换、加载、清洗等任务。 这其中,就产生了大量的数据血缘关系。为了更好的对企业内数据进行治理,整理存储过程中的数据血缘工作是必不可少的。

分析存储过程中的数据血缘,游标 cursor 是一个关键因素,数据流一般都是围绕着游标进行处理。

在下面这个 Oracle PL/SQL 的存储过程中,首先定义了游标 CURSOR cur_stclerk。

DECLARE
CURSOR cur_stclerk IS
SELECT employee_id,
department_id,
first_name,
last_name
FROM employees
WHERE job_id = 'ST_CLERK';

然后通过这个游标,用 LOOP 进行循环, 把数据从 employees 表中插入到表 emp_temp 和 emp_detls_temp。

INSERT INTO emp_temp
(employee_id,
department_id,
job_id)
VALUES (z_empid,
z_depid,
'ST_CLERK'); INSERT INTO emp_detls_temp
(employee_id,
empname)
VALUES (z_empid,
z_firstname
|| ' '
|| z_lastname);
END LOOP; CLOSE cur_stclerk;
COMMIT;
END;

因此我们可以建立从 employees 表到表 emp_temp 和 emp_detls_temp 的数据血缘。 

完整的 PLSQL 存储过程。

DECLARE
z_empid employees.employee_id%TYPE;
z_depid employees.department_id%TYPE;
z_firstname employees.first_name%TYPE;
z_lastname employees.last_name%TYPE; CURSOR cur_stclerk IS
SELECT employee_id,
department_id,
first_name,
last_name
FROM employees
WHERE job_id = 'ST_CLERK';
BEGIN
OPEN cur_stclerk;
LOOP
FETCH cur_stclerk INTO z_empid,z_depid,z_firstname,
z_lastname;
EXIT WHEN cur_stclerk%NOTFOUND; INSERT INTO emp_temp
(employee_id,
department_id,
job_id)
VALUES (z_empid,
z_depid,
'ST_CLERK'); INSERT INTO emp_detls_temp
(employee_id,
empname)
VALUES (z_empid,
z_firstname
|| ' '
|| z_lastname);
END LOOP; CLOSE cur_stclerk;
COMMIT;
END;

自动化数据血缘分析工具

SQLFlow 支持分析多达 20 多种主流数据库的 SQL 语句。 支持的数据库有 bigquery, couchbase, dax, db2, greenplum, hana, hive, impala, informix, mdx, mysql, netezza, odbc, openedge, oracle, postgresql, redshift, snowflake, sparksql, sqlserver, sybase, teradata, vertica。

支持分析存储过程和动态 SQL 语句。

通过 UI 分析 SQL 语句

通过 SQLFlow 的 UI 可以快速的获取一个 SQL 的数据血缘情况, 并可以得到可视化的结果,帮助用户迅速了解一个 SQL 中的数据血缘。

通过 API 方式分析 SQL 的数据血缘

有时,我们需要把分析所得的数据血缘作为元数据存储到我们自己的数据治理平台中,和其它元数据进行整合, 这时,我们可以利用 SQLFlow 提供的 Restful API, 利用 shell, python 等脚本对数据血缘分析工作进行自动化。

这里用 curl 展示如何用 API 访问 SQLFlow 进行数据血缘分析。

  • 准备好用 API 连接 SQLFlow 需要的 userid 和 secret code
  • 利用 userid 和 secret code 来获取 token。注意,用你自己的 userid 和 secret code 来替换掉命令中的对应部分。
    curl -X POST "https://api.gudusoft.com/gspLive_backend/user/generateToken" -H  "Request-Origion:testClientDemo" -H  "accept:application/json;charset=utf-8" -H  "Content-Type:application/x-www-form-urlencoded;charset=UTF-8" -d "secretKey=YOUR SECRET KEY" -d "userId=YOUR USER ID HERE"
  • 把需要分析的 SQL 语句递交给 SQLFlow 进行分析,并返回处理结果。注意,用你自己的 userid 和上面命令中返回的 token 来替换掉命令中的对应部分。
    curl -X POST "https://api.gudusoft.com/gspLive_backend/sqlflow/generation/sqlflow?showRelationType=fdd" -H  "Request-Origion:testClientDemo" -H  "accept:application/json;charset=utf-8" -H  "Content-Type:multipart/form-data" -F "sqlfile=" -F "dbvendor=dbvoracle" -F "ignoreRecordSet=true" -F "simpleOutput=false" -F "sqltext=create view v_sal(mySal) as select  sal + commission as totalSal from emp;" -F "userId=YOUR USER ID HERE"  -F "token=YOUR TOKEN HERE"
  • 返回的 json 包含了如下数据血缘关系。
    "relations": [
    {
    "id": "3",
    "type": "fdd",
    "effectType": "create_view",
    "target": {
    "id": "11",
    "column": "mySal",
    "parentId": "9",
    "parentName": "v_sal",
    },
    "sources": [
    {
    "id": "3",
    "column": "sal",
    "parentId": "2",
    "parentName": "emp",
    },
    {
    "id": "4",
    "column": "commission",
    "parentId": "2",
    "parentName": "emp",
    }
    ],
    "processId": "10"
    }
    ]

更详细的信息见官网 SQLFlow Restful API

小结

本文介绍了如何通过分析 Oracle 的 SQL 语句和存储过程来获取组织中的数据血缘,从而更好的进行数据治理。 并介绍了如何利用 SQLFlow 工具把分析 SQL 语句中的数据血缘工作自动化, 提高数据自理效率和水平。

文档信息

数据治理中Oracle SQL和存储过程的数据血缘分析的更多相关文章

  1. Oracle dbms_lock.sleep()存储过程使用技巧-场景-分析-实例

    <Oracle dbms_lock.sleep()存储过程使用技巧>-场景-分析-实例 摘要:今天是2014年3月10日,北京,雾霾,下午组织相关部门开会.会议的结尾一名开发工程师找到了我 ...

  2. Java使用JDBC连接数据库逐条插入数据、批量插入数据、以及通过SQL语句批量导入数据的效率对比

    测试用的示例java代码: package com.zifeiy.test.normal; import java.io.File; import java.io.FileOutputStream; ...

  3. SQL server存储过程:数据的插入和更新

    存储过程的功能非常强大,在某种程度上甚至可以替代业务逻辑层, 接下来就一个小例子来说明,用存储过程插入或更新语句. 1.数据库表结构 所用数据库为Sql Server2008. 2.创建存储过程 (1 ...

  4. 转:不在同一个服务器上的数据库之间的数据操作(oracle/sql server的对比)

    如何操做不在同一个数据库中的数据操作: 一.对于SQL server来讲:  1.采用创建链接服务器的方式:    (1).创建链接服务器       exec sp_addlinkedserver  ...

  5. oracle之数据同步:Oracle Sql Loader使用说明(大批量快速插入数据库记录)

    1.准备表数据 select * from emp10; create sequence seq_eseq increment start maxvalue ; --得到序列的SQL语句 select ...

  6. oracle sql生成临时递增数据

    1.生成1至10记录 select rownum from dual connect 结果: 12345678910 2.生成最近12个月记录 ), 'yyyyMM') time from dual ...

  7. sql server存储过程返回数据只有一个字符

    SqlParameter[] param = { new SqlParameter("@shopId",shopId), new SqlParameter("@newSh ...

  8. oracle sql 数据库之间导入数据

    1.导入别的表 insert into EMPI_IDENTIFY select id,empiid, name||':' ||idcardno,'accidcardno','' from empi_ ...

  9. Android - 数据存储 -在SQL数据库中保存数据

    对于重复的或结构化的数据,保存到数据库中是很好的选择,比如联系人信息.这里假设你对SQL数据库大体上了解然后帮助你学习Android上的SQLite数据库.在Android数据库上需要用到的API可以 ...

随机推荐

  1. C# / vb.net 给PDF 添加可视化和不可见数字签名

    本文通过C#程序代码展示如何给PDF文档添加可视化数字签名和不可见数字签名.可视化数字签名,即在PDF文档中的指定页面位置添加签名,包含相关文字信息和签名图片等:不可见数字签名,即添加签名时不在文档中 ...

  2. 2020年度钻石C++C学习笔记(3)--《博学谷》

    1.Unix/Linux操作系统介绍 1.1 操作系统的作用 1.1.1 操作系统的目标 l 方便:使计算机系统易于使用 l 有效:以更有效的方式使用计算机系统资源 l 扩展:方便用户有效开发.测试和 ...

  3. Jetpack MVVM 实战项目,附带源码+视频,收藏!

    从读者的反馈来看,近期大部分安卓开发已跳出舒适圈,开始尝试认识和应用 Jetpack MVVM 到实际的项目开发中. 只可惜,关于 Jetpack MVVM,网上多是 东拼西凑.人云亦云.通篇贴代码  ...

  4. goproxy.io

    goproxy.io 是全球最早的 Go modules 镜像代理服务之一, 采用 CDN 加速服务为开发者提供依赖下载, 该服务由一批热爱开源, 热爱 Go 语言的年轻人开发维护.从 Go 1.11 ...

  5. Java 执行控制流程

    1.带标签的break会中断并跳出标签所指的循环: 2.带标签的continue会中断本次循环,并开始标签所指处循环的下一轮循环.

  6. Greenplum数仓监控解决方案(开源版本)

    Greenplum监控解决方案 基于Prometheus+Grafana+greenplum_exporter+node_exporter实现 关联图 一.基本概念 1.Prometheus ​ Pr ...

  7. 温故知新,微软官方推荐的Visual Studio源代码管理之Git Ignore清单,开启新项目必备宝书

    什么是Git Ignore清单 https://git-scm.com/docs/gitignore 简单来说,在Git进行源代码管理中,我们可以通过建立.gitignore来实现一个忽略的黑名单管理 ...

  8. Ubuntu系统Root用户无法登录

    默认 系统 root 登录 图形界面,出现 登录失败.解决方法如下: 1,登录普通用户, 打开终端执行命令, 使用su root或sudo -i切换到root用户(必须) su root 按照提示输入 ...

  9. 002 TCP/IP模型

    一.TCP/IP 的含义 一般来说,TCP/IP是利用IP进行通信时所必须用到的协议群的统称. 具体点,IP或ICMP.TCP或UDP.TELENT或FTP.以及HTTP等都属于TCP/IP协议,而T ...

  10. 基于Apache Hudi构建数据湖的典型应用场景介绍

    1. 传统数据湖存在的问题与挑战 传统数据湖解决方案中,常用Hive来构建T+1级别的数据仓库,通过HDFS存储实现海量数据的存储与水平扩容,通过Hive实现元数据的管理以及数据操作的SQL化.虽然能 ...