sqlflow 对 oracle package 对象的解析

2022-04-23

    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