type
status
date
slug
summary
tags
category
icon
password
最近收到这么个需求:追溯帆软仪表板用到的所有数据库源表。解析脚本是有现成的,如果是追溯帆软报表(FR, Fine Report)的话其实会更简单些,因为 FR 有保存物理文件(.cpt, .cptx),直接解析就行。而 BI 仪表板并没有物理文件,所以得稍微绕一下,不过思路还是比较清晰的:
仪表板 -> 所用数据集 -> 数据集引用表 -> 源SQL -> 脚本解析数据库源表
基础数据
找官方技术支持一顿咨询,拿到了这么两段SQL(这里简化了一下):
SQL-1
NAME[VARCHAR2] | TABLES[CLOB] |
A | ["TABLE1", "TABLE2"] |
B | [“TABLE3”] |
C | [“TABLE4”] |
SQL-2
ID[VARCHAR2] | ORIGNAME[CLOB] | SQLVAL[CLOB] |
1 | TABLE1 | SELECT * FROM R_CISP_1 |
2 | TABLE2 | SELECT * FROM R_CISP_2 |
3 | TABLE3 | SELECT * FROM R_CISP_3 |
4 | TABLE4 | SELECT * FROM R_CISP_4 |
注意:
- TBL1.TABLES 为 CLOB 类型,值为多个 TBL2.ORIGNAME 的列表
- 关联条件为 TBL1.TABLES 和 TBL2.ORIGNAME
解决思路
TABLES
是一个ORIGNAME
的集合,直接关联显然不行,我的想法是用正则来进行匹配关联:然后还得区分下表的来源数据库,类比 SQL-2 不难得到存储数据库名的数据行为:
剔除下官方内置仪表板的数据,整理得最后的 SQL:
关联结果:
用户名 | 仪表板名 | 数据集所用表 | 数据库 | 表名 | SQL |
zhangsan | A | ["TABLE1", "TABLE2"] | impala | TABLE1 | SELECT * FROM R_CISP_1 |
zhangsan | A | ["TABLE1", "TABLE2"] | impala | TABLE2 | SELECT * FROM R_CISP_2 |
lisi | B | [“TABLE3”] | oracle | TABLE3 | SELECT * FROM R_CISP_3 |
wangwu | C | [“TABLE4”] | mysql | TABLE4 | SELECT * FROM R_CISP_3 |
搞定,是想要的结果~(由于保密规定,上述实际数据均替换成了造数据。)
- Author:Jarrett Au
- URL:https://blog.coding-park.top//article/finbi-dataset-sql
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!