sqlflow 对 oracle package 对象的解析

l  数据血缘关系(data lineage)

数据血缘属于数据治理中的一个概念,是在数据溯源的过程中找到相关数据之间的联系,它是一个逻辑概念。数据治理中经常提到血缘分析,血缘分析是保证数据融合的一个手段,通过血缘分析实现数据融合处理的可追溯。数据血缘是指数据产生的链路,直白点说,就是我们这个数据是怎么来的,经过了哪些过程和阶段。

l  SQLFlow是什么? 

SQLFlow 通过分析各种数据库对象定义(DDL)语句、数据操作(DML) 语句、ETL/ELT中使用的存储过程(Proceudre,Function)、 触发器(Trigger)和其他 SQL 脚本,给出完整的数据血缘关系。它不仅可以展现对象间的关系,也可以帮你提取表的字段。

官方链接:https://sqlflow.gudusoft.com

Grabit 可以帮助你轻松使用sqlflow,并带来愉悦的使用感受。Grabit 是 SQLFlow 的一个配套工具,它从各种数据源中为 SQLFlow 收集 SQL 脚本,然后上传到 SQLFlow 中,对这些 SQL 脚本进行数据沿袭分析。分析结果可以在浏览器中查看。同时,数据沿袭结果将被提取到安装 Grabit 的目录中,如果需要,可以将 JSON 结果上传到 Neo4j 数据库。

抓取概述

使用命令方式启动Grabit:

  • mac & linux
./start.sh -f <path_to_config_file>  

note: 
    path_to_config_file: the full path to the config file

eg: 
    ./start.sh -f config.txt
  • windows
start.bat -f <path_to_config_file>  

note: 
    path_to_config_file: the full path to the config file

eg: 
    start.bat -f config.txt

上述脚本中会均需要使用到配置文件(config.txt),下面详细介绍一下配置文件的基本格式:

配置文件基本格式:

{
	"databaseServer":{
		"hostname":"ipaddr",
		"port":"1521",
		"username":"username",
		"password":"SQeEs44QL8NbLCpqYig4DA==gbtepted",
		"database":"orcl",
		"extractedDbsSchemas":"SQLFLOWDB1,SQLFLOWDB2,SQLFLOWDB3",
		"excludedDbsSchemas":"",
		"extractedStoredProcedures":"",
		"extractedViews":"",
		"enableQueryHistory":false,
		"queryHistoryBlockOfTimeInMinutes":30,
		"snowflakeDefaultRole":null,
		"queryHistorySqlType":null
	},
	"gitServer":null,
	"SQLInSingleFile":null,
	"SQLInDirectory":null,
	"SQLFlowServer":{
		"server":"http://xxxx.sqlflow.cn",
		"serverPort":"8081",
		"userId":"userid",
		"userSecret":null
	},
	"atlasServer":null,
	"neo4jConnection":null,
	"SQLScriptSource":"database",
	"lineageReturnFormat":null,
	"databaseType":"oracle",
	"isUploadNeo4j":0,
	"enableGetMetadataInJSONFromDatabase":0,
	"isUploadAtlas":0,
	"lineageReturnOutputFile":null
}

其中databaseServer和SQLFlowServer是您需要重点进行配置的,上图中加粗斜体均需按照实际情况进行配置:

databaseServer配置:

hostname

Grabit 连接的数据库服务器的 IP。

port

Grabit 连接的数据库服务器的端口号。

username

用于登录数据库的数据库用户。

password

数据库用户的密码。

注意:密码可以使用工具[#Encrypted](#Encrypted password)进行加密,使用加密密码更安全。

database

Oracle实例名称。

SQLFlowServer配置:

本地版本sqlflow的示例配置:

“SQLFlowServer”:{
	 “server”:“ 127.0.0.1 ”,
	 “serverPort”:“ 8081 ”,
	 “userId”:“ gudu|0123456789 ”,
	 “userSecret”:“ ” 
}

云版本的示例配置:

"SQLFlowServer" :{
	 "server" : " https://api.gudusoft.com " ,
	 "serverPort" : " " ,
	 "userId" : "这里是你自己的用户 id " ,
	 "userSecret" : "这里是你自己的密钥" 
}

相对于其他数据库,Oracle数据库中有一种特殊的对象类型是package,它是一组程序的集合,sqlflow能够支持该类对象中包含的血缘关系解析。下面详细介绍sqlflow对package对象的支持

示例代码1,SQLFLOWDB1下的表DBINFODETAIL的定义

-- SQLFLOWDB1.DBINFODETAIL definition

CREATE TABLE "SQLFLOWDB1"."DBINFODETAIL" 
   (	"DBID" NUMBER, 
	"NAME" VARCHAR2(9), 
	"INSTANCE_NAME" VARCHAR2(16), 
	"VERSION" VARCHAR2(17), 
	"RAC" VARCHAR2(3), 
	"HOST_NAME" VARCHAR2(64)
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;

示例代码2,SQLFLOWDB2下的chen_pack包


CREATE OR REPLACE package SQLFLOWDB2.chen_pack
is
    function f_c_getstaffNum(in_status in varchar2) return number;
    procedure p_c_sendmsg(receiver in varchar2,content in varchar2);
end;

CREATE OR REPLACE package body SQLFLOWDB2.chen_pack
as

    function f_c_getstaffNum(in_status in varchar2)
     return number
     as
         outnum number;
     begin
         select count(1) into outnum from t_ucp_staffbasicinfo g where g.staffidstatus = in_status;
     return outnum;
    end f_c_getstaffNum;

    procedure p_c_sendmsg(receiver in varchar2,content in varchar2)
      as
      begin
        insert into t_c_msg(sender,receiver,content,sendtime)
       SELECT DBID, NAME, INSTANCE_NAME, SYSDATE FROM SQLFLOWDB1.DBINFODETAIL;

       -- values('10658666',receiver,content,sysdate);
        commit;
    end p_c_sendmsg;

end chen_pack;

示例代码3:SQLFLOWDB3下的sqlflow包

CREATE OR REPLACE package SQLFLOWDB3.sqlflow
is

    procedure p_getdata;
end;

CREATE OR REPLACE package body SQLFLOWDB3.sqlflow
as
    procedure p_getdata
      as
      begin
        insert into get_c_msg(sender,receiver,content,sendtime)
       SELECT * FROM SQLFLOWDB2.t_c_msg where sender='1553407471';
        commit;
    end p_getdata;

end sqlflow;

上述来源不同schema下的三个对象间应具有以下血缘关系:

SQLFLOWDB1.DBINFODETAIL(DBID, NAME, INSTANCE_NAME, SYSDATE)->
SQLFLOWDB2.t_c_msg(sender,receiver,content,sendtime) -> SQLFLOWDB3.get_c_msg(sender,receiver,content,sendtime)

通过使用grabit上传该实例下的对象到sqlflow分析,可以看到目标表及两个package包均被成功解析,如下:

此时,查看对象间数据血缘分析如下:

通过上图,可以清晰的看到在不同的schema下普通对象与package对象间的数据流向已被成功解析。

关于package及grabit的进一步了解及使用,请访问sqlflow官方网站。

sqlflow数据血缘分析器: https://sqlflow.gudusoft.com

马哈鱼数据血缘分析器中文网站: https://www.sqlflow.cn