SQL脚本解析方法、装置及系统.pdf

上传人:奻奴 文档编号:1036956 上传时间:2018-03-27 格式:PDF 页数:22 大小:538.67KB
返回 下载 相关 举报
摘要
申请专利号:

CN201010253875.4

申请日:

2010.08.13

公开号:

CN102375826A

公开日:

2012.03.14

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 17/30申请日:20100813|||公开

IPC分类号:

G06F17/30

主分类号:

G06F17/30

申请人:

中国移动通信集团公司; 广州石竹计算机软件有限公司

发明人:

何鸿凌; 陈仲亮; 魏春辉; 李政; 陶涛; 林旭; 薛勇

地址:

100032 北京市西城区金融大街29号

优先权:

专利代理机构:

北京中誉威圣知识产权代理有限公司 11279

代理人:

丛芳;彭晓玲

PDF下载: PDF下载
内容摘要

本发明公开了一种SQL脚本解析方法、装置及系统。其中SQL脚本解析方法,包括:A、按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;B、对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;C、根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。本发明的SQL脚本解析方法、装置及系统,通过对SQL脚本进行词法、语法、语义以及上下文相关性分析,避免在生

权利要求书

1: 一种 SQL 脚本解析方法, 其特征在于, 包括 : A、 按照运行日志中的 SQL 脚本执行顺序, 从运行日志中提取 SQL 脚本 ; B、 对每条 SQL 脚本依次进行词法、 语法和语义进行分析, 生成 SQL 脚本的语义结果集 ; C、 根据所述语义结果集分析所述 SQL 脚本的上下文类型, 生成所述运行日志中各个 SQL 脚本之间的上下文相关信息, 根据所述语义结果集和所述上下文相关信息获得所述运 行日志的数据流信息。
2: 根据权利要求 1 所述的 SQL 脚本解析方法, 其特征在于, 所述步骤 B 具体包括 : B1、 读取所述 SQL 脚本的字符串, 对字符串的字符序列进行单词提取, 生成单词序列 ; B2、 分析所述单词序列的语法结构, 生成语法树 ; B3、 遍历所述语法树, 根据语法树中每个结点的语义和语法结构, 生成所述 SQL 脚本的 语义结果集。
3: 根据权利要求 1 所述的 SQL 脚本解析方法, 其特征在于, 所述运行日志中包括 : SQL 脚本及上下文辅助信息 ; 所述步骤 C 具体包括 : 进一步根据所述上下文辅助信息分析所述 SQL 脚本的上下文类 型, 生成上下文相关信息。
4: 根据权利要求 3 所述的 SQL 脚本解析方法, 其特征在于, 所述上下文辅助信息包括 : 缺省数据库连接信息 ; 所述步骤 C 具体包括 : 根据所述缺省数据库连接信息确定每条 SQL 脚本的缺省 schema ; 根据所述缺省 schema 获得数据库实体在原数据库中的定位。
5: 根据权利要求 1 所述的 SQL 脚本解析方法, 其特征在于, 所述运行日志采用日志文件 或日志表的存储方式, 所述日志文件采用文本文件记录日志内容 ; 所述日志表采用数据库表记录日志内容。
6: 一种 SQL 脚本解析装置, 其特征在于, 包括 : 提取模块, 用于按照运行日志中的 SQL 脚本执行顺序从运行日志中提取 SQL 脚本 ; 词法、 语法和语义分析模块, 对每条 SQL 脚本依次进行词法、 语法和语义进行分析, 生 成 SQL 脚本的语义结果集 ; 上下文相关性分析模块, 用于根据所述语义结果集分析所述 SQL 脚本的上下文类型, 生成所述运行日志中各个 SQL 脚本之间的上下文相关信息, 根据所述语义结果集和所述上 下文相关信息获得所述运行日志的数据流信息。
7: 根据权利要求 6 所述的 SQL 脚本解析装置, 其特征在于, 所述词法分析模块, 用于读取所述 SQL 脚本的字符串, 对字符串的字符序列进行单词 提取, 生成单词序列 ; 所述语法分析模块, 用于分析所述单词序列的语法结构, 生成语法树 ; 所述语义分析模块, 用于遍历所述语法树, 根据语法树中每个结点的语义和语法结构, 生成所述 SQL 脚本的语义结果集。
8: 根据权利要求 7 所述的 SQL 脚本解析装置, 其特征在于, 所述上下文相关性分析模块, 进一步根据所述上下文辅助信息分析所述 SQL 脚本的上 下文类型, 生成上下文相关信息。 2
9: 一种 SQL 脚本解析系统, 其特征在于, 包括 : 运行日志存储装置, 用于存储脚本程序运行时生成的运行日志 ; SQL 脚本解析装置, 用于按照运行日志中的 SQL 脚本执行顺序, 从运行日志中提取 SQL 脚本 ; 对每条 SQL 脚本依次进行词法、 语法和语义进行分析, 生成 SQL 脚本的语义结果集 ; 根据所述语义结果集分析所述 SQL 脚本的上下文类型, 生成所述运行日志中各个 SQL 脚本 之间的上下文相关信息, 根据所述语义结果集和所述上下文相关信息获得所述运行日志的 数据流信息。
10: 根据权利要求 9 所述的 SQL 脚本解析系统, 其特征在于, 所述运行日志存储装置, 采 用日志文件或日志表的方式存储所述运行日志, 所述日志文件采用文本文件记录日志内容 ; 所述日志表采用数据库表记录日志内容。
11: 根据权利要求 10 所述的 SQL 脚本解析系统, 其特征在于, 所述运行日志存储装置, 对于所述脚本程序的每次运行, 都在相应的目录下存储一个 独立的日志文件, 所述日志文件的文件名与所述脚本程序相对应。
12: 根据权利要求 10 所述的 SQL 脚本解析系统, 其特征在于, 所述运行日志存储装置, 对于日志表的存储方式, 存储运行日志总体表和运行日志明 细表 ; 都在所述运行日志总体表的每条记录, 对应所述脚本程序的每次运行生成的一个运行 日志 ; 所述运行日志明细表对应所述运行日志的详细信息。
13: 根据权利要求 9 所述的 SQL 脚本解析系统, 其特征在于, 所述运行日志存储装置, 存 储脚本程序中所有提交到数据库执行的 SQL 脚本及上下文辅助信息。
14: 根据权利要求 13 所述的 SQL 脚本解析系统, 其特征在于, 所述 SQL 脚本解析装置, 进一步根据所述上下文辅助信息分析所述 SQL 脚本的上下文类型, 生成上下文相关信息。
15: 根据权利要求 9 所述的 SQL 脚本解析系统, 其特征在于, 所述运行日志存储装置分 布在不同的 schema 或数据库服务器中。
16: 根据权利要求 9 所述的 SQL 脚本解析系统, 其特征在于, 所述 SQL 脚本解析装置, 通 过 FTP 方式或 JDBC 访问所述运行日志存储装置。

说明书


SQL 脚本解析方法、 装置及系统

    【技术领域】
     本发明涉及一种元数据管理技术, 尤其涉及一种 SQL 脚本解析方法、 装置及系统。背景技术 目前很多大型企业如通信、 金融等行业的企业都已经建立了元数据管理系统, 以 加强对日益膨胀的数据仓库系统的有效管理。在这些元数据管理系统中, 其中有大部分仍 然采用手工整理方式管理 SQL 脚本元数据。而有些企业则在最近几年开始尝试一种 SQL 脚 本元数据自动获取方案。这种方案基于编译技术, 设法提取 ETL 和数据处理过程的 SQL 脚 本, 然后对这些 SQL 脚本进行词法、 语法和语义分析, 并将获得的 SQL 脚本数据流信息翻译 成 SQL 脚本元数据。
     整个方案划分 3 个环节, 在第一个环节中, 目前获取 SQL 脚本的方式主要有三种, 包括直接从 ETL 和数据处理过程的程序代码中提取、 从数据库日志中提取或者从 ETL 和数 据处理过程的运行日志中提取。在第二个环节中, 利用编译技术对提取出来的 SQL 脚本进
     行词法和语法分析, 形成语法树, 以此作为语义分析的基础。在第三个环节中, 对 SQL 脚本 的语法树进行语义分析。如果在语义分析过程中发现该 SQL 脚本包含完整的数据流语义信 息, 则将这些数据流语义翻译成元数据, 否则不做翻译处理。
     如图 1 所示, 将每个 SQL 脚本看出是一个数据流语义信息的独立载体, 对每个 SQL 脚本单独进行获取和处理, 并生成该 SQL 脚本的元数据, 而不需要考虑 SQL 脚本的上下文环 境。
     现有方案是基于每条 SQL 脚本的数据流语义信息与上下文环境无关这样一个假 设进行处理的。当这个假设成立时, 可以自动生成质量很好的 SQL 脚本元数据。但是, 当部 分 SQL 脚本不满足这个假设时, ETL 和数据处理过程中所包含的部分数据流信息就会被丢 失, 最终没有生成相应的元数据。
     造成信息丢失的原因主要有两个 :
     1、 环节一的 SQL 脚本获取方式不合理
     在环节一中, 现有方案有三种 SQL 脚本的获取方式。 包括从数据库日志中提取 SQL 脚本的方式、 直接从程序块源代码中提取 SQL 脚本的方式和从程序块的运行日志中提取 SQL 脚本的方式。
     如果采取从数据库日志中提取 SQL 脚本的方式, 则无法判断所提取的 SQL 脚本属 于哪个程序块, 这些 SQL 脚本中程序块中的先后执行关系和上下文环境信息也无法获知。 因此采用这种方式获取 SQL 脚本, 在后续环节生成元数据时, 就没有足够信息来建立 SQL 脚 本与程序块的关系、 结合上下文环境来分析 SQL 脚本的数据流语义。
     如果采取直接从程序块的源代码中提取 SQL 脚本的方式, 对于以静态 SQL 为主的 存储过程脚本, 这种方式是比较有效的。 但是在很多情况下, 程序块的源代码中编写了大量 的动态拼装 SQL 脚本的代码。现有技术方案无法从源代码提取这种动态 SQL 脚本。因此采 取这种方式获取 SQL 脚本, 会丢失所有的动态 SQL 脚本, 这些 SQL 脚本所包含的数据流语义也就无法翻译成元数据。
     如果采用从程序块的运行日志中提取 SQL 脚本的方式, 目前的方案只考虑将运行 日志作为 SQL 脚本传递的媒介, 并没有建立一种运行日志输出机制, 可以将 SQL 脚本按上下 文环境进行有效组织。缺乏了这些上下文环境信息, 后续处理环节遇到上下文相关的 SQL 脚本时, 就很难保证元数据的生成质量。
     2、 环节三的元数据生成缺乏上下文环境的分析处理方法
     在环节三中, 现有方案一方面受到环节一的限制, 另一方面在本环节也没有综合 上下文环境来解析 SQL 脚本的数据流语义, 将每条 SQL 脚本孤立起来处理。当 SQL 脚本存 在上下文相关特性时, 往往无法正确生成元数据。
     综上所述, 现有方案虽然可以一定程度上解决 SQL 脚本元数据的管理问题, 但是 现有方案没有通过提供一种机制将 SQL 脚本和相关的上下文环境辅助信息有机组织起来, 从而有可能丢失一些数据流语义信息, 影响了 SQL 脚本元数据的自动获取质量。 发明内容 本发明的目的在于, 提供一种 SQL 脚本解析方法、 装置及系统, 避免数据流语义信 息的丢失, 提高获取 SQL 脚本的元数据的完整性和准确性。
     为实现上述目的, 根据本发明的一个方面, 提供一种 SQL 脚本解析方法, 包括 :
     A、 按照运行日志中的 SQL 脚本执行顺序, 从运行日志中提取 SQL 脚本 ;
     B、 对每条 SQL 脚本依次进行词法、 语法和语义进行分析, 生成 SQL 脚本的语义结果 集;
     C、 根据所述语义结果集分析所述 SQL 脚本的上下文类型, 生成所述运行日志中各 个 SQL 脚本之间的上下文相关信息, 根据所述语义结果集和所述上下文相关信息获得所述 运行日志的数据流信息。
     为实现上述目的, 根据本发明的另一个方面, 提供一种 SQL 脚本解析装置, 包括 :
     提取模块, 用于按照运行日志中的 SQL 脚本执行顺序从运行日志中提取 SQL 脚 本;
     词法、 语法和语义分析模块, 对每条 SQL 脚本依次进行词法、 语法和语义进行分 析, 生成 SQL 脚本的语义结果集 ;
     上下文相关性分析模块, 用于根据所述语义结果集分析所述 SQL 脚本的上下文类 型, 生成所述运行日志中各个 SQL 脚本之间的上下文相关信息, 根据所述语义结果集和所 述上下文相关信息获得所述运行日志的数据流信息。
     为实现上述目的, 根据本发明的另一个方面, 提供一种 SQL 脚本解析系统, 包括 :
     运行日志存储装置, 用于存储脚本程序运行时生成的运行日志 ;
     SQL 脚本解析装置, 用于按照运行日志中的 SQL 脚本执行顺序, 从运行日志中提取 SQL 脚本 ; 对每条 SQL 脚本依次进行词法、 语法和语义进行分析, 生成 SQL 脚本的语义结果 集; 根据所述语义结果集分析所述 SQL 脚本的上下文类型, 生成所述运行日志中各个 SQL 脚 本之间的上下文相关信息, 根据所述语义结果集和所述上下文相关信息获得所述运行日志 的数据流信息。
     本发明的 SQL 脚本解析方法、 装置及系统, 通过对 SQL 脚本进行词法、 语法、 语义以
     及上下文相关性分析, 避免在生成 SQL 脚本的元数据时, 数据流语义信息的丢失, 从而提高 获取 SQL 脚本的元数据的完整性和准确性, 保证 SQL 脚本元数据的获取质量。 附图说明 图 1 是现有技术中对 SQL 脚本分析的过程示意图 ;
     图 2 是本发明日志文件的格式的示意图 ;
     图 3 是本发明 SQL 脚本解析方法实施例的流程图 ;
     图 4 是本发明语法树的示意图 ;
     图 5a 是本发明 SQL 脚本解析方法实施例中有无缺省数据库连接信息后 SQL 脚本 分析结果对比示意图 ;
     图 5b 是本发明 SQL 脚本解析方法实施例中创建和使用临时表的 SQL 脚本之间存 在上下文相关的关系的示意图 ;
     图 5c 是本发明 SQL 脚本解析方法实施例中不预先处理临时表创建脚本所引起的 错误的示意图 ;
     图 5d 是本发明 SQL 脚本解析方法实施例中 RENAME 句型 SQL 脚本对命名空间的影 响和解析处理方式示意图 ;
     图 6 是本发明 SQL 脚本解析装置实施例的结构图 ; 图 7 是本发明 SQL 脚本解析系统实施例的结构图。具体实施方式
     本发明中, 数据仓库系统的 ETL 和数据处理过程中, 每次脚本程序的运行, 都将相 关内容写入运行日志, 并将运行日志输出到运行日志区。
     运行日志区是一个运行日志存储装置, 在物理实现上可以采用如下两种方式 :
     1、 文件目录, 运行日志以日志文件的方式提交到这些文件目录中 ;
     2、 数据库表, 运行日志以库表记录的方式写入这些数据库表中。
     如果采用文件目录方式, 运行日志区可以分布在多台主机上。每台主机根据本机 的脚本程序部署情况确定运行日志区的目录结构。 脚本程序的运行日志输出到指定的目录 中。SQL 脚本解析装置的通过 FTP 方式访问运行日志存储装置。
     如果采用数据库表方式, 运行日志区可以分布在多个不同的 schema 或者数据库 服务器中。SQL 脚本解析装置的通过 JDBC 连接数据库, 访问运行日志区。
     每个脚本程序一次运行所输出的日志, 必须完整输出到运行日志存储装置, 并标 记运行日志的起始和结束位置, 以便 SQL 脚本解析装置根据这些标记确认运行日志的完整 性。
     SQL 脚本解析装置定时检查运行日志区, 提取其中未经处理运行日志进行 SQL 脚 本解析处理。 SQL 脚本解析装置每次处理一个完整的运行日志, 将生成这个运行日志所对应 脚本程序的元数据。
     运行日志的内容主要包括 :
     1、 提交到数据库执行的 SQL 脚本, 脚本程序中所有提交到数据库执行的 SQL 脚本 都要完整写入运行日志中, 这些 SQL 脚本应该是数据库服务器可以直接执行的, 不能包含脚本程序变量等非数据库语法单元 ( 存储过程除外 ) ;
     2、 上下文辅助信息, 如缺省数据库连接信息、 临时表信息、 命名空间信息或 SQL 脚 本循环信息 ;
     其中, 缺省数据库连接信息, 是脚本程序存在多次创建数据库链接, 分别向不同 schema 提交 SQL 脚本的情况下, 将创建链接的信息 ( 包括数据库服务器、 用户名等 ) 按规 定格式写入运行日志中的, 以便 SQL 脚本解析装置据此确定后续执行的 SQL 脚本的缺省 schema 是什么
     运行日志可以采用日志文件或者日志表两种存储方式。 其中日志文件方式采用文 本文件记录日志内容, 而日志表方式采用数据库表记录日志内容。下面分别说明日志文件 和日志表的格式要求 :
     1、 日志文件格式
     每个脚本程序在中运行日志区中都有一个固定的日志文件输出目录。 不同脚本程 序可以共用一个日志文件输出目录。
     脚本程序每次运行时, 都需要在该目录下输出一个独立的日志文件。这些日志文 件应具有明确的文件命名规则, 以便 SQL 脚本解析装置确定运行日志与脚本程序的对应关 系。 写入日志文件中的文本所采用的字符集应该与 UTF-8 和 GBK 兼容。
     如图 2 所示, 日志文件的内容划分文件头、 文件体和文件结束标志 3 个部分。这三 个部分必须按先后顺序依次写入日志文件。
     1) 文件头的格式要求
     文件头必须依次写入如下内容 :
     a) 脚本程序名
     格式 : [PROC] 脚本程序名 [/PROC]。
     其中的脚本程序名是指脚本程序的文件名, 为避免在不同路径下出现重名脚本程 序名的情况, 这里的文件名应包括文件路径。
     b) 脚本程序版本号
     格式 : [VERSION] 脚本程序版本号 [/VERSION]
     其中的脚本程序版本号是一个字符串, 格式不限。
     c) 脚本程序最近修改时间
     格式 : [MODIFY DATE] 脚本程序最近修改时间 [/MODIFY DATE]
     其中的脚本程序最近修改时间是指脚本程序文件最后一次更新的时间, 可以采用 操作系统中记录的文件修改时间。
     时间格式 : yyyy-mm-dd hh24:mi:ss
     d) 脚本程序本次运行的输入参数
     格式 : [PARA] 参数描述串 [/PARA]
     其中的参数描述串用于记录脚本程序本次运行时, 从外部传进来的参数值, 参数 描述串的格式 : “参数名 1 =参数值 1 ; 参数名 2 =参数值 2 ; ......” 。
     e) 脚本程序本次运行的启动时间
     格式 : [BEGIN TIME] 脚本程序本次运行的启动时间 [/BEGIN TIME]
     时间格式 : yyyy-mm-dd hh24:mi:ss
     2) 文件体的格式要求
     文件体记录脚本程序运行时提交到数据库执行的所有 SQL 脚本、 创建数据库连接 的相关参数以及文件导入导出操作命令。
     以下内容必须按脚本程序运行的先后顺序写入文件体中。
     a) 提交到数据库执行的 SQL 脚本
     格式 :
     [SQL]
     SQL 脚本
     [/SQL]
     其中的 SQL 脚本是指一条可执行的 SQL 语句。SQL 脚本的起止标志 [SQL] 和 [/ SQL] 必须分别独占一行。而 SQL 脚本可以占一行或者多行。
     b) 创建数据库链接的相关参数
     如果在脚本程序中存在建立数据库连接的操作, 则相关的数据库连接参数 ( 密码 除外 ) 需要以连接串的方式写入日志文件。 格式 : [CONN] 数据库连接串 [/CONN]
     其中的数据库连接串应采用如下格式的字符串进行记录 : “参数名 1 =参数值 1 ; 参数名 2 =参数值 2 ; ...” 。这些参数应包括 : 数据库类型、 数据库所在主机、 数据库实例名 和连接用户等内容。
     c) 文件导入导出操作 (import/export/load/unload)
     格式 : [SQL] 文件导入导出操作命令 [/SQL]
     其中的文件导入导出操作命令是指一条 import/export/load/unload 命令的完 整文本。
     3) 文件结束标志
     文件结束标志用于 SQL 脚本解析装置确认一个日志文件的完整性, 避免日志文件 在输出过程还没完全结束时就被 SQL 脚本解析装置提取出来处理 ;
     文件结束标志格式 : [END TIME] 脚本程序本次运行的结束时间 [/ENDTIME] ;
     时间格式 : yyyy-mm-dd hh24:mi:ss。
     2、 日志表格式
     如果在运行日志区中采用数据库表来存储运行日志的内容, 则这组日志表的表结 构和数据格式必须遵守日志表的格式要求。日志表由如下两张数据库表组成 :
     运行日志总体表 : sqlparser_log_general
     运行日志明细表 : sqlparser_log_detail
     每个脚本程序的每次运行输出一个运行日志。 运行日志总体表中的每条记录对应 一个运行日志, 而运行日志的详细信息写入运行日志明细表中。
     运行日志总体表的填写要求如下表 1 所示 :
     表1
     运行日志明细表填写要求如下表 2 所示。 表2以下结合附图对本发明进行详细说明。
     方法实施例
     数据仓库系统的 ETL 和数据处理过程中, 有很多脚本程序的组合 SQL 脚本, 属于上 下文相关的组合 SQL 脚本。在解析处理这些组合 SQL 脚本时, 需要识别 SQL 脚本之间的上 下文关系, 否则很可能导致解析结果出错。
     如图 3 所示, 本发明 SQL 脚本解析方法实施例主要包括以下步骤 :
     步骤 302, 按照运行日志中的 SQL 脚本执行顺序, 从运行日志中提取 SQL 脚本 ; 每 个运行日志对应 ETL 和数据处理过程中的一个程序块 ;
     步骤 304, 读取所述 SQL 脚本的字符串, 对字符串的字符序列进行单词提取, 生成 满足 SQL 脚本的保留字、 常量、 变量等的单词序列 ;
     例如, 对字符串 “rename A01 to B01” 进行 SQL 脚本词法分析后, 形成如下单词序 列: “rename” 、 “A01” 、 “to” 、 “B01” ;
     步骤 306, 对上述词法分析环节输出的单词序列进行语法分析, 获取其语法结构, 生成语法树 ; 如图 4 所示, 语法树是以树形结构描述一条 SQL 脚本的语法结构 ;
     步骤 308, 遍历步骤 306 中获得的语法树, 根据语法树中每个结点的语义和语法结 构, 生成 SQL 脚本的语义结果集 ;
     例如, 如图 4 所示, 对 Rename 语句进行语义分析, 遇到 Rename 结点, 即可知道这是 一个数据库表的改名操作, 遍历后续结点 OldTableName, 即可知道这是改名之前的库表名, 再往下遍历, 可以找到改名前的库表名是 A01, 遍历整个语法树后, 就可以获得如下语义信 息: 将库表 A01 改名为 B01 ; 获得的语义结果集包括 : 3 个对象 : 库表 A01、 库表 B01 和改名操 作; 以及两个关系 : 库表 A01 与改名操作的关系, 库表 B01 与改名操作的关系 ; 步骤 310, 根据所述语义结果集分析所述 SQL 脚本的上下文类型, 生成所述运行日 志中各个 SQL 脚本之间的上下文相关信息, 根据所述语义结果集和上下文相关信息获得运 行日志的数据流信息,
     上下文类型主要包括 : 缺省数据库连接信息、 临时表、 命名空间及 SQL 脚本循环等 等。
     另外, 运行日志中除了 SQL 脚本外, 可能还包括上下文辅助信息, 因此, 在步骤 310 中, 还需要根据根据所述上下文辅助信息分析所述 SQL 脚本的上下文类型, 生成上下文相 关信息。
     上下文辅助信息包括 : 缺省数据库连接信息。 上述步骤 310 具体包括 : 根据所述缺 省数据库连接信息确定每条 SQL 脚本的缺省 schema ; 根据所述缺省 schema 获得数据库实 体在原数据库中的定位。
     本实施例中, 上下文相关的 SQL 脚本主要有以下几种关系 : 缺省数据库连接信息、 临时表、 命名空间或 SQL 脚本循环等。以下对这几种情况 SQL 脚本的上下文相关性解析分 别举例说明。
     (1) 当多条 SQL 脚本之间存在创建数据库连接和关闭数据库连接的操作, 根据上 下文辅助信息中的缺省数据库连接信息确定每条 SQL 脚本的缺省 schema。
     数据库连接决定了 SQL 脚本运行的缺省 schema, 而数据库实体在元数据库中的定 位需要依赖于该数据库实体所属 schema。因此, 除非 SQL 脚本的每个数据库表 / 视图都标 明所属 schema, 否则必须预先知道 SQL 脚本执行时的缺省 schema。
     如果在一个脚本程序的多条 SQL 脚本之间, 存在创建数据库连接和关闭数据库连 接的操作, 则这些 SQL 脚本执行的缺省 schema 可能不一样。这时需要根据创建数据库连接 的信息来确定每条 SQL 脚本的缺省 schema。
     如图 5a 所示, 有如下的 SQL 脚本 :
     CONNECT TO S02
     INSERTINTO A02 SELECT...FROM S01.A01
     CONNECT TO S03
     INSERTINTO A02 SELECT...FROM S01.A01
     如果不能识别数据库连接信息及其与 SQL 脚本的先后顺序, 则有可能生成错误结 果, 错误的解析结果如图 5a 中的 501 所示为 A02 ; 而正确的解析结果应当如 5a 中的 502 所 示的分别为 S02.A02 和 S03.A03。
     (2) 当 SQL 脚本中存在对临时表的操作时, 根据查询子句确定临时表的结构, 根据 所述临时表结构对所述 SQL 脚本进行上下文相关性分析。
     如果在一条 SQL 脚本中存在对临时表的操作, 而且这个临时表是在该 SQL 脚本执 行前创建的, 那么这条 SQL 脚本的解析过程很可能需要依赖与创建临时表的 SQL 脚本所包 含的信息。在经营分析系统中, 有很多脚本程序通过一个查询子句创建临时表。这种情况 需要根据该查询子句来确定临时表的结构, 并将这些结构信息应用于后续 SQL 脚本的解析 处理过程中。
     如图 5b 所示, 有如下的 SQL 脚本 :
     SQL01 : CREATE TABLE TA(fa1, fa2) ;
     SQL02 : INSERT INTO TA SELECT fb1, fb2 FROM TB ;
     如果不首先解析第一条 SQL 脚本, 获取 TA 的库表结构, 则 Transformer 对象的目 标关系无法建立, 错误的解析结果如图 5b 中的 503 所示 ; 而正确的解析结果应当如 5b 中的 504 所示。
     如图 5c 所示, 不预先处理临时表创建脚本也会引起的解析错误。
     有如下的 SQL 脚本 :
     SQL01 : CREATE TABLE TA(fa1, fa2, fa3) ;
     SQL02 : INSERT INTO TA(fa1, fa2)SELECT fb1, fb2 FROM TB ;
     错误的解析结果如图 5c 中的 505 所示, 缺少 fa3 字段 ; 而正确的解析结果应当如 5b 中的 506 所示。
     (3) 对于命名空间信息的处理, 识别 SQL 脚本中同一标识的数据库表的不同命名 空间信息, 对所述数据库表的标识增加相应的命名前缀, 根据所述命名前缀对所述 SQL 脚 本进行上下文相关性分析 ;
     在脚本程序中, 一个数据库表的命名只能在一定范围内标识该数据库表, 当这个 命名超出该范围时, 所标识的是其他数据库表, 这个范围就称为命名空间。
     一般情况下, 数据库表的命名空间会覆盖脚本程序的所有 SQL 脚本。但是, 如果在 脚本程序中存在 RENAME 句型的 SQL 脚本, 或者 DROP 表操作的 SQL 脚本, 则这些 SQL 脚本的 上下文会影响数据库表的命名空间, 甚至出现同一个命名有多个命名空间, 分别标识多个 不同的数据库表的情况。
     这种情况下, SQL 脚本解析时需要识别同一标识的不同命名空间, 通过对这个命名 标识增加命名前缀来加以区分。
     数据库表命名空间与 SQL 脚本的关系如下 :
     1、 CREATE 句型是指在执行期间创建数据库表的 SQL 脚本。所创建的数据库表的命名对应一个新 的命名空间。
     2、 RENAME 句型
     SQL 脚本 RENAME TABLE A01 TO A02 影响两个数据库表的命名空间。其中 A01 的 命名标识范围结束, A02 创建一个新的命名空间。
     3、 DROP 句型
     SQL 脚本 DROP TABLE A01 令 A01 的命名标识范围结束。
     如图 5d 所示, 有如下的 SQL 脚本 :
     SQL01 : CREATE TABLE TA AS SELECT...FROM TB0... ; //TA 的 NameSpace01 开始
     SQL02 : RENAME TABLE TA TO TA0 ; //TA 的 NameSpace01 结束
     //TA0 的 NameSpace01 开始
     SQL03 : CREATE TABLE TA AS SELECT...FROM TB1... ; //TA 的 NameSpace02 开始
     SQL04 : RENAME TABLE TA TO TA1 ; //TA 的 NameSpace02 结束
     //TA1 的 NameSpace01 开始
     不区分命名空间的情况下, 将 SQL01 和 SQL03 所创建的 TA 视为同一张表, 解析出 错误的结果, 如图 5d 中的 507 所示, 事实上这两张表很可能具有不同的表结构 ; 正确的解析 结果如图 5d 中的 508 所示。
     (4) 当 SQL 脚本为循环时, 将多个结构类似的 SQL 脚本识别为一个 SQL 脚本, 并对 该循环的 SQL 脚本进行上下文相关性分析。
     如果脚本程序中存在一个循环体内的 SQL 脚本, 那么这个 SQL 脚本输出到运行日 志后, 可能会是多个结构类似的 SQL 脚本。对这批本来不是组合 SQL 脚本的组合 SQL 脚本 进行处理时, 需要将其识别为一个 SQL 脚本, 解析生成的结果应该是一个 SQL 脚本的结构化 描述结果。
     以下对上述步骤 310 进行具体举例说明, 运行日志如下表 3 所示,
     表3
     当解析处理该运行日志时, 首先创建一个空的上下文相关信息, 如下表 4 所示, 表4
     依次解析运行日志中的每一条信息。 1、 解析第一条 :[CONN]″ schema = S01″ [/CONN],
     这并不是一条 SQL 语句, 而是一条上下文辅助信息, 因此不生成语义结果集, 其上 下文类型属于改变数据库连接类型, 针对这种上下文类型的处理, 是将上下文环境中的缺 省 schema 修改为新的 schema, 修改后的上下文相关信息如下表 5 所示。
     表5
     2、 解析第二条 :
     [SQL]
     Create table TB(b1 int, b2 int)
     [/SQL]
     对这条 SQL 语句进行词法语法和语义分析后, 其语义结果集是 TB 的表结构。结合 当前的上下文相关信息, TB 所属 schema 是 S01, 同时该 SQL 句型涉及临时表和命名空间的 处理, 需要将 S01.TB 的表结构和命名空间登记到上下文相关信息中, 如下表 6 所示。
     表6
     3、 解析第三条 :
     [SQL]
     Insert into TB select...from S02.TA...
     [/SQL]
     对这条 SQL 语句进行词法语法和语义分析后, 其语义结果集是读取表 S02.TA 的数 据, 写入 TB 中, 这时要访问上下文相关信息, 才能知道 TB 是属于命名空间 01 中的 S01.TB, 其表结构是 (b1 int, b2 int)。综合这些信息, 可生成该 SQL 语句的元数据信息。
     这条 SQL 语句不需要更新上下文相关信息。
     4、 解析第四条 :
     [CONN]″ schema = S02″ [/CONN]
     修改上下文相关信息中的缺省 schema, 如下表 7 所示 :
     表7
     5、 解析第五条 :
     [SQL]
     Rename S01.TB to S01.TB01
     [/SQL]
     该 SQL 语句的语义结构集, 是将 S01 下的库表 TB 改名为 TB01, 生成改名的元数据 信息。同时, 这里涉及上下文相关信息中命名空间的变化, 而 TB01 继承了 TB 的表结构, 这 个表结构需要从上下文相关信息中获得, 此外, 还要登记 TB01 的命名空间, 为此要修改上 下文相关信息, 如下表 8 所示。
     表8
     6、 解析第六条 :
     [SQL]
     Create table S01.TB(b1 string, b2 string, b3 string)
     [/SQL]
     在 S01 下面创建库表 TB, 检查上下文相关信息得知, 由于之前的 S01.TB 的命名空 间 01 已经结束, 现在的 TB 要登记一个新的命名空间 02, 同时要将 TB 的表结构记录到上下 文相关信息中, 如下表 9 所示。
     表9
     本实施例的 SQL 脚本解析方法, 通过对 SQL 脚本进行词法、 语法、 语义以及上下文 相关性分析, 避免在生成 SQL 脚本的元数据时, 数据流语义信息的丢失, 从而提高获取 SQL 脚本的元数据的完整性和准确性, 保证 SQL 脚本元数据的获取质量。另外, 通过在运行日志 中加入上下文辅助信息, 在上下文相关性分析 SQL 脚本时, 同时考虑该上下文辅助信息, 能 够更精确的判断 SQL 脚本与上下文的关系, 进一步提高获取 SQL 脚本的元数据的完整性和 准确性, 保证 SQL 脚本元数据的获取质量。
     装置实施例
     如图 6 所示, 本发明 SQL 脚本解析装置实施例包括 :
     提取模块 602, 用于按照运行日志中的 SQL 脚本执行顺序从运行日志中提取 SQL 脚 本;
     词法、 语法和语义分析模块, 对每条 SQL 脚本依次进行词法、 语法和语义进行分 析, 生成 SQL 脚本的语义结果集 ;
     上下文相关性分析模块 610, 用于根据所述语义结果集分析所述 SQL 脚本的上下 文类型, 生成所述运行日志中各个 SQL 脚本之间的上下文相关信息, 根据所述语义结果集 和所述上下文相关信息获得所述运行日志的数据流信息。
     其中, 词法分析模块 604, 用于读取所述 SQL 脚本的字符串, 对字符串的字符序列 进行单词提取, 生成单词序列 ;
     语法分析模块 606, 用于分析所述单词序列的语法结构, 生成语法树 ;
     语义分析模块 608, 用于遍历所述语法树, 根据语法树中每个结点的语义和语法结 构, 生成所述 SQL 脚本的语义结果集。
     本实施例 SQL 脚本解析装置中, 各模块的工作方式在上述方法实施例中已经详细 说明, 在此不再赘述。
     本实施例的 SQL 脚本解析装置, 通过对 SQL 脚本进行词法、 语法、 语义以及上下文 相关性分析, 避免在生成 SQL 脚本的元数据时, 数据流语义信息的丢失, 从而提高获取 SQL 脚本的元数据的完整性和准确性, 保证 SQL 脚本元数据的获取质量。
     系统实施例
     如图 7 所示, 本发明 SQL 脚本解析系统实施例包括 :
     运行日志存储装置 72, 用于存储脚本程序运行时生成的运行日志 ;
     SQL 脚本解析装置 74, 用于按照运行日志中的 SQL 脚本执行顺序, 从运行日志中提 取 SQL 脚本 ; 对每条 SQL 脚本依次进行词法、 语法和语义进行分析, 生成 SQL 脚本的语义结 果集 ; 根据所述语义结果集分析所述 SQL 脚本的上下文类型, 生成所述运行日志中各个 SQL 脚本之间的上下文相关信息, 根据所述语义结果集和所述上下文相关信息获得所述运行日 志的数据流信息。
     其中, 运行日志存储装置 72, 采用日志文件或日志表的方式存储所述运行日志。
     所述日志文件采用文本文件记录日志内容, 对于所述脚本程序的每次运行, 都在 相应的目录下存储一个独立的日志文件, 所述日志文件的文件名与所述脚本程序相对应。
     所述日志表采用数据库表记录日志内容, 对于日志表的存储方式, 存储运行日志 总体表和运行日志明细表 ; 都在所述运行日志总体表的每条记录, 对应所述脚本程序的每 次运行生成的一个运行日志 ; 所述运行日志明细表对应所述运行日志的详细信息。
     优选地, 运行日志中包括 : 脚本程序中所有提交到数据库执行的 SQL 脚本及上下 文辅助信息。 SQL 脚本解析装置 74 则进一步根据所述上下文辅助信息分析所述 SQL 脚本的 上下文类型, 生成上下文相关信息。
     如果采用文件目录方式, 运行日志区可以分布在多台主机上。每台主机根据本机 的脚本程序部署情况确定运行日志区的目录结构。 脚本程序的运行日志输出到指定的目录 中。SQL 脚本解析装置的通过 FTP 方式访问运行日志存储装置。
     如果采用数据库表方式, 运行日志区可以分布在多个不同的 schema 或者数据库 服务器中。SQL 脚本解析装置的通过 JDBC 连接数据库, 访问运行日志区。
     本实施例的 SQL 脚本解析系统, 通过对 SQL 脚本进行词法、 语法、 语义以及上下文 相关性分析, 避免在生成 SQL 脚本的元数据时, 数据流语义信息的丢失, 从而提高获取 SQL 脚本的元数据的完整性和准确性, 保证 SQL 脚本元数据的获取质量。另外, 通过在运行日志 中加入上下文辅助信息, 在上下文相关性分析 SQL 脚本时, 同时考虑该上下文辅助信息, 能 够更精确的判断 SQL 脚本与上下文的关系, 进一步提高获取 SQL 脚本的元数据的完整性和 准确性, 保证 SQL 脚本元数据的获取质量。
     应说明的是 : 以上实施例仅用以说明本发明而非限制, 本发明也并不仅限于上述 举例, 一切不脱离本发明的精神和范围的技术方案及其改进, 其均应涵盖在本发明的权利 要求范围中。

SQL脚本解析方法、装置及系统.pdf_第1页
第1页 / 共22页
SQL脚本解析方法、装置及系统.pdf_第2页
第2页 / 共22页
SQL脚本解析方法、装置及系统.pdf_第3页
第3页 / 共22页
点击查看更多>>
资源描述

《SQL脚本解析方法、装置及系统.pdf》由会员分享,可在线阅读,更多相关《SQL脚本解析方法、装置及系统.pdf(22页珍藏版)》请在专利查询网上搜索。

1、10申请公布号CN102375826A43申请公布日20120314CN102375826ACN102375826A21申请号201010253875422申请日20100813G06F17/3020060171申请人中国移动通信集团公司地址100032北京市西城区金融大街29号申请人广州石竹计算机软件有限公司72发明人何鸿凌陈仲亮魏春辉李政陶涛林旭薛勇74专利代理机构北京中誉威圣知识产权代理有限公司11279代理人丛芳彭晓玲54发明名称SQL脚本解析方法、装置及系统57摘要本发明公开了一种SQL脚本解析方法、装置及系统。其中SQL脚本解析方法,包括A、按照运行日志中的SQL脚本执行顺序,从运。

2、行日志中提取SQL脚本;B、对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;C、根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。本发明的SQL脚本解析方法、装置及系统,通过对SQL脚本进行词法、语法、语义以及上下文相关性分析,避免在生成SQL脚本的元数据时,数据流语义信息的丢失,从而提高获取SQL脚本的元数据的完整性和准确性,保证SQL脚本元数据的获取质量。51INTCL19中华人民共和国国家知识产权局12发明专利申请权利要求书2页说明书15。

3、页附图4页CN102375833A1/2页21一种SQL脚本解析方法,其特征在于,包括A、按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;B、对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;C、根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。2根据权利要求1所述的SQL脚本解析方法,其特征在于,所述步骤B具体包括B1、读取所述SQL脚本的字符串,对字符串的字符序列进行单词提取,生成单词序列;B2、分析所述单词序列的语法结构,生。

4、成语法树;B3、遍历所述语法树,根据语法树中每个结点的语义和语法结构,生成所述SQL脚本的语义结果集。3根据权利要求1所述的SQL脚本解析方法,其特征在于,所述运行日志中包括SQL脚本及上下文辅助信息;所述步骤C具体包括进一步根据所述上下文辅助信息分析所述SQL脚本的上下文类型,生成上下文相关信息。4根据权利要求3所述的SQL脚本解析方法,其特征在于,所述上下文辅助信息包括缺省数据库连接信息;所述步骤C具体包括根据所述缺省数据库连接信息确定每条SQL脚本的缺省SCHEMA;根据所述缺省SCHEMA获得数据库实体在原数据库中的定位。5根据权利要求1所述的SQL脚本解析方法,其特征在于,所述运行日。

5、志采用日志文件或日志表的存储方式,所述日志文件采用文本文件记录日志内容;所述日志表采用数据库表记录日志内容。6一种SQL脚本解析装置,其特征在于,包括提取模块,用于按照运行日志中的SQL脚本执行顺序从运行日志中提取SQL脚本;词法、语法和语义分析模块,对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;上下文相关性分析模块,用于根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。7根据权利要求6所述的SQL脚本解析装置,其特征在于,所述词法分析模块,。

6、用于读取所述SQL脚本的字符串,对字符串的字符序列进行单词提取,生成单词序列;所述语法分析模块,用于分析所述单词序列的语法结构,生成语法树;所述语义分析模块,用于遍历所述语法树,根据语法树中每个结点的语义和语法结构,生成所述SQL脚本的语义结果集。8根据权利要求7所述的SQL脚本解析装置,其特征在于,所述上下文相关性分析模块,进一步根据所述上下文辅助信息分析所述SQL脚本的上下文类型,生成上下文相关信息。权利要求书CN102375826ACN102375833A2/2页39一种SQL脚本解析系统,其特征在于,包括运行日志存储装置,用于存储脚本程序运行时生成的运行日志;SQL脚本解析装置,用于按。

7、照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。10根据权利要求9所述的SQL脚本解析系统,其特征在于,所述运行日志存储装置,采用日志文件或日志表的方式存储所述运行日志,所述日志文件采用文本文件记录日志内容;所述日志表采用数据库表记录日志内容。11根据权利要求10所述的SQL脚本解析系统,其特征在于,所述运行日志存储装置,对于所述脚本。

8、程序的每次运行,都在相应的目录下存储一个独立的日志文件,所述日志文件的文件名与所述脚本程序相对应。12根据权利要求10所述的SQL脚本解析系统,其特征在于,所述运行日志存储装置,对于日志表的存储方式,存储运行日志总体表和运行日志明细表;都在所述运行日志总体表的每条记录,对应所述脚本程序的每次运行生成的一个运行日志;所述运行日志明细表对应所述运行日志的详细信息。13根据权利要求9所述的SQL脚本解析系统,其特征在于,所述运行日志存储装置,存储脚本程序中所有提交到数据库执行的SQL脚本及上下文辅助信息。14根据权利要求13所述的SQL脚本解析系统,其特征在于,所述SQL脚本解析装置,进一步根据所述。

9、上下文辅助信息分析所述SQL脚本的上下文类型,生成上下文相关信息。15根据权利要求9所述的SQL脚本解析系统,其特征在于,所述运行日志存储装置分布在不同的SCHEMA或数据库服务器中。16根据权利要求9所述的SQL脚本解析系统,其特征在于,所述SQL脚本解析装置,通过FTP方式或JDBC访问所述运行日志存储装置。权利要求书CN102375826ACN102375833A1/15页4SQL脚本解析方法、装置及系统技术领域0001本发明涉及一种元数据管理技术,尤其涉及一种SQL脚本解析方法、装置及系统。背景技术0002目前很多大型企业如通信、金融等行业的企业都已经建立了元数据管理系统,以加强对日益。

10、膨胀的数据仓库系统的有效管理。在这些元数据管理系统中,其中有大部分仍然采用手工整理方式管理SQL脚本元数据。而有些企业则在最近几年开始尝试一种SQL脚本元数据自动获取方案。这种方案基于编译技术,设法提取ETL和数据处理过程的SQL脚本,然后对这些SQL脚本进行词法、语法和语义分析,并将获得的SQL脚本数据流信息翻译成SQL脚本元数据。0003整个方案划分3个环节,在第一个环节中,目前获取SQL脚本的方式主要有三种,包括直接从ETL和数据处理过程的程序代码中提取、从数据库日志中提取或者从ETL和数据处理过程的运行日志中提取。在第二个环节中,利用编译技术对提取出来的SQL脚本进行词法和语法分析,形。

11、成语法树,以此作为语义分析的基础。在第三个环节中,对SQL脚本的语法树进行语义分析。如果在语义分析过程中发现该SQL脚本包含完整的数据流语义信息,则将这些数据流语义翻译成元数据,否则不做翻译处理。0004如图1所示,将每个SQL脚本看出是一个数据流语义信息的独立载体,对每个SQL脚本单独进行获取和处理,并生成该SQL脚本的元数据,而不需要考虑SQL脚本的上下文环境。0005现有方案是基于每条SQL脚本的数据流语义信息与上下文环境无关这样一个假设进行处理的。当这个假设成立时,可以自动生成质量很好的SQL脚本元数据。但是,当部分SQL脚本不满足这个假设时,ETL和数据处理过程中所包含的部分数据流信。

12、息就会被丢失,最终没有生成相应的元数据。0006造成信息丢失的原因主要有两个00071、环节一的SQL脚本获取方式不合理0008在环节一中,现有方案有三种SQL脚本的获取方式。包括从数据库日志中提取SQL脚本的方式、直接从程序块源代码中提取SQL脚本的方式和从程序块的运行日志中提取SQL脚本的方式。0009如果采取从数据库日志中提取SQL脚本的方式,则无法判断所提取的SQL脚本属于哪个程序块,这些SQL脚本中程序块中的先后执行关系和上下文环境信息也无法获知。因此采用这种方式获取SQL脚本,在后续环节生成元数据时,就没有足够信息来建立SQL脚本与程序块的关系、结合上下文环境来分析SQL脚本的数据。

13、流语义。0010如果采取直接从程序块的源代码中提取SQL脚本的方式,对于以静态SQL为主的存储过程脚本,这种方式是比较有效的。但是在很多情况下,程序块的源代码中编写了大量的动态拼装SQL脚本的代码。现有技术方案无法从源代码提取这种动态SQL脚本。因此采取这种方式获取SQL脚本,会丢失所有的动态SQL脚本,这些SQL脚本所包含的数据流语义说明书CN102375826ACN102375833A2/15页5也就无法翻译成元数据。0011如果采用从程序块的运行日志中提取SQL脚本的方式,目前的方案只考虑将运行日志作为SQL脚本传递的媒介,并没有建立一种运行日志输出机制,可以将SQL脚本按上下文环境进行。

14、有效组织。缺乏了这些上下文环境信息,后续处理环节遇到上下文相关的SQL脚本时,就很难保证元数据的生成质量。00122、环节三的元数据生成缺乏上下文环境的分析处理方法0013在环节三中,现有方案一方面受到环节一的限制,另一方面在本环节也没有综合上下文环境来解析SQL脚本的数据流语义,将每条SQL脚本孤立起来处理。当SQL脚本存在上下文相关特性时,往往无法正确生成元数据。0014综上所述,现有方案虽然可以一定程度上解决SQL脚本元数据的管理问题,但是现有方案没有通过提供一种机制将SQL脚本和相关的上下文环境辅助信息有机组织起来,从而有可能丢失一些数据流语义信息,影响了SQL脚本元数据的自动获取质量。

15、。发明内容0015本发明的目的在于,提供一种SQL脚本解析方法、装置及系统,避免数据流语义信息的丢失,提高获取SQL脚本的元数据的完整性和准确性。0016为实现上述目的,根据本发明的一个方面,提供一种SQL脚本解析方法,包括0017A、按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;0018B、对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;0019C、根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。0020为实现上述目的,根。

16、据本发明的另一个方面,提供一种SQL脚本解析装置,包括0021提取模块,用于按照运行日志中的SQL脚本执行顺序从运行日志中提取SQL脚本;0022词法、语法和语义分析模块,对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;0023上下文相关性分析模块,用于根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。0024为实现上述目的,根据本发明的另一个方面,提供一种SQL脚本解析系统,包括0025运行日志存储装置,用于存储脚本程序运行时生成的运行日志;。

17、0026SQL脚本解析装置,用于按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。0027本发明的SQL脚本解析方法、装置及系统,通过对SQL脚本进行词法、语法、语义以说明书CN102375826ACN102375833A3/15页6及上下文相关性分析,避免在生成SQL脚本的元数据时,数据流语义信息的丢失,从而提高获取SQL脚本的元数。

18、据的完整性和准确性,保证SQL脚本元数据的获取质量。附图说明0028图1是现有技术中对SQL脚本分析的过程示意图;0029图2是本发明日志文件的格式的示意图;0030图3是本发明SQL脚本解析方法实施例的流程图;0031图4是本发明语法树的示意图;0032图5A是本发明SQL脚本解析方法实施例中有无缺省数据库连接信息后SQL脚本分析结果对比示意图;0033图5B是本发明SQL脚本解析方法实施例中创建和使用临时表的SQL脚本之间存在上下文相关的关系的示意图;0034图5C是本发明SQL脚本解析方法实施例中不预先处理临时表创建脚本所引起的错误的示意图;0035图5D是本发明SQL脚本解析方法实施例。

19、中RENAME句型SQL脚本对命名空间的影响和解析处理方式示意图;0036图6是本发明SQL脚本解析装置实施例的结构图;0037图7是本发明SQL脚本解析系统实施例的结构图。具体实施方式0038本发明中,数据仓库系统的ETL和数据处理过程中,每次脚本程序的运行,都将相关内容写入运行日志,并将运行日志输出到运行日志区。0039运行日志区是一个运行日志存储装置,在物理实现上可以采用如下两种方式00401、文件目录,运行日志以日志文件的方式提交到这些文件目录中;00412、数据库表,运行日志以库表记录的方式写入这些数据库表中。0042如果采用文件目录方式,运行日志区可以分布在多台主机上。每台主机根据。

20、本机的脚本程序部署情况确定运行日志区的目录结构。脚本程序的运行日志输出到指定的目录中。SQL脚本解析装置的通过FTP方式访问运行日志存储装置。0043如果采用数据库表方式,运行日志区可以分布在多个不同的SCHEMA或者数据库服务器中。SQL脚本解析装置的通过JDBC连接数据库,访问运行日志区。0044每个脚本程序一次运行所输出的日志,必须完整输出到运行日志存储装置,并标记运行日志的起始和结束位置,以便SQL脚本解析装置根据这些标记确认运行日志的完整性。0045SQL脚本解析装置定时检查运行日志区,提取其中未经处理运行日志进行SQL脚本解析处理。SQL脚本解析装置每次处理一个完整的运行日志,将生。

21、成这个运行日志所对应脚本程序的元数据。0046运行日志的内容主要包括00471、提交到数据库执行的SQL脚本,脚本程序中所有提交到数据库执行的SQL脚本都要完整写入运行日志中,这些SQL脚本应该是数据库服务器可以直接执行的,不能包含说明书CN102375826ACN102375833A4/15页7脚本程序变量等非数据库语法单元存储过程除外;00482、上下文辅助信息,如缺省数据库连接信息、临时表信息、命名空间信息或SQL脚本循环信息;0049其中,缺省数据库连接信息,是脚本程序存在多次创建数据库链接,分别向不同SCHEMA提交SQL脚本的情况下,将创建链接的信息包括数据库服务器、用户名等按规定。

22、格式写入运行日志中的,以便SQL脚本解析装置据此确定后续执行的SQL脚本的缺省SCHEMA是什么0050运行日志可以采用日志文件或者日志表两种存储方式。其中日志文件方式采用文本文件记录日志内容,而日志表方式采用数据库表记录日志内容。下面分别说明日志文件和日志表的格式要求00511、日志文件格式0052每个脚本程序在中运行日志区中都有一个固定的日志文件输出目录。不同脚本程序可以共用一个日志文件输出目录。0053脚本程序每次运行时,都需要在该目录下输出一个独立的日志文件。这些日志文件应具有明确的文件命名规则,以便SQL脚本解析装置确定运行日志与脚本程序的对应关系。0054写入日志文件中的文本所采用。

23、的字符集应该与UTF8和GBK兼容。0055如图2所示,日志文件的内容划分文件头、文件体和文件结束标志3个部分。这三个部分必须按先后顺序依次写入日志文件。00561文件头的格式要求0057文件头必须依次写入如下内容0058A脚本程序名0059格式PROC脚本程序名/PROC。0060其中的脚本程序名是指脚本程序的文件名,为避免在不同路径下出现重名脚本程序名的情况,这里的文件名应包括文件路径。0061B脚本程序版本号0062格式VERSION脚本程序版本号/VERSION0063其中的脚本程序版本号是一个字符串,格式不限。0064C脚本程序最近修改时间0065格式MODIFYDATE脚本程序最近。

24、修改时间/MODIFYDATE0066其中的脚本程序最近修改时间是指脚本程序文件最后一次更新的时间,可以采用操作系统中记录的文件修改时间。0067时间格式YYYYMMDDHH24MISS0068D脚本程序本次运行的输入参数0069格式PARA参数描述串/PARA0070其中的参数描述串用于记录脚本程序本次运行时,从外部传进来的参数值,参数描述串的格式“参数名1参数值1;参数名2参数值2;”。0071E脚本程序本次运行的启动时间0072格式BEGINTIME脚本程序本次运行的启动时间/BEGINTIME说明书CN102375826ACN102375833A5/15页80073时间格式YYYYMM。

25、DDHH24MISS00742文件体的格式要求0075文件体记录脚本程序运行时提交到数据库执行的所有SQL脚本、创建数据库连接的相关参数以及文件导入导出操作命令。0076以下内容必须按脚本程序运行的先后顺序写入文件体中。0077A提交到数据库执行的SQL脚本0078格式0079SQL0080SQL脚本0081/SQL0082其中的SQL脚本是指一条可执行的SQL语句。SQL脚本的起止标志SQL和/SQL必须分别独占一行。而SQL脚本可以占一行或者多行。0083B创建数据库链接的相关参数0084如果在脚本程序中存在建立数据库连接的操作,则相关的数据库连接参数密码除外需要以连接串的方式写入日志文件。

26、。0085格式CONN数据库连接串/CONN0086其中的数据库连接串应采用如下格式的字符串进行记录“参数名1参数值1;参数名2参数值2;”。这些参数应包括数据库类型、数据库所在主机、数据库实例名和连接用户等内容。0087C文件导入导出操作IMPORT/EXPORT/LOAD/UNLOAD0088格式SQL文件导入导出操作命令/SQL0089其中的文件导入导出操作命令是指一条IMPORT/EXPORT/LOAD/UNLOAD命令的完整文本。00903文件结束标志0091文件结束标志用于SQL脚本解析装置确认一个日志文件的完整性,避免日志文件在输出过程还没完全结束时就被SQL脚本解析装置提取出来。

27、处理;0092文件结束标志格式ENDTIME脚本程序本次运行的结束时间/ENDTIME;0093时间格式YYYYMMDDHH24MISS。00942、日志表格式0095如果在运行日志区中采用数据库表来存储运行日志的内容,则这组日志表的表结构和数据格式必须遵守日志表的格式要求。日志表由如下两张数据库表组成0096运行日志总体表SQLPARSER_LOG_GENERAL0097运行日志明细表SQLPARSER_LOG_DETAIL0098每个脚本程序的每次运行输出一个运行日志。运行日志总体表中的每条记录对应一个运行日志,而运行日志的详细信息写入运行日志明细表中。0099运行日志总体表的填写要求如下。

28、表1所示0100表10101说明书CN102375826ACN102375833A6/15页90102运行日志明细表填写要求如下表2所示。0103表20104说明书CN102375826ACN102375833A7/15页100105以下结合附图对本发明进行详细说明。0106方法实施例0107数据仓库系统的ETL和数据处理过程中,有很多脚本程序的组合SQL脚本,属于上下文相关的组合SQL脚本。在解析处理这些组合SQL脚本时,需要识别SQL脚本之间的上下文关系,否则很可能导致解析结果出错。说明书CN102375826ACN102375833A8/15页110108如图3所示,本发明SQL脚本解析。

29、方法实施例主要包括以下步骤0109步骤302,按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;每个运行日志对应ETL和数据处理过程中的一个程序块;0110步骤304,读取所述SQL脚本的字符串,对字符串的字符序列进行单词提取,生成满足SQL脚本的保留字、常量、变量等的单词序列;0111例如,对字符串“RENAMEA01TOB01”进行SQL脚本词法分析后,形成如下单词序列“RENAME”、“A01”、“TO”、“B01”;0112步骤306,对上述词法分析环节输出的单词序列进行语法分析,获取其语法结构,生成语法树;如图4所示,语法树是以树形结构描述一条SQL脚本的语法结构;01。

30、13步骤308,遍历步骤306中获得的语法树,根据语法树中每个结点的语义和语法结构,生成SQL脚本的语义结果集;0114例如,如图4所示,对RENAME语句进行语义分析,遇到RENAME结点,即可知道这是一个数据库表的改名操作,遍历后续结点OLDTABLENAME,即可知道这是改名之前的库表名,再往下遍历,可以找到改名前的库表名是A01,遍历整个语法树后,就可以获得如下语义信息将库表A01改名为B01;获得的语义结果集包括3个对象库表A01、库表B01和改名操作;以及两个关系库表A01与改名操作的关系,库表B01与改名操作的关系;0115步骤310,根据所述语义结果集分析所述SQL脚本的上下文。

31、类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和上下文相关信息获得运行日志的数据流信息,0116上下文类型主要包括缺省数据库连接信息、临时表、命名空间及SQL脚本循环等等。0117另外,运行日志中除了SQL脚本外,可能还包括上下文辅助信息,因此,在步骤310中,还需要根据根据所述上下文辅助信息分析所述SQL脚本的上下文类型,生成上下文相关信息。0118上下文辅助信息包括缺省数据库连接信息。上述步骤310具体包括根据所述缺省数据库连接信息确定每条SQL脚本的缺省SCHEMA;根据所述缺省SCHEMA获得数据库实体在原数据库中的定位。0119本实施例中,上下文相关的。

32、SQL脚本主要有以下几种关系缺省数据库连接信息、临时表、命名空间或SQL脚本循环等。以下对这几种情况SQL脚本的上下文相关性解析分别举例说明。01201当多条SQL脚本之间存在创建数据库连接和关闭数据库连接的操作,根据上下文辅助信息中的缺省数据库连接信息确定每条SQL脚本的缺省SCHEMA。0121数据库连接决定了SQL脚本运行的缺省SCHEMA,而数据库实体在元数据库中的定位需要依赖于该数据库实体所属SCHEMA。因此,除非SQL脚本的每个数据库表/视图都标明所属SCHEMA,否则必须预先知道SQL脚本执行时的缺省SCHEMA。0122如果在一个脚本程序的多条SQL脚本之间,存在创建数据库连。

33、接和关闭数据库连接的操作,则这些SQL脚本执行的缺省SCHEMA可能不一样。这时需要根据创建数据库连接的信息来确定每条SQL脚本的缺省SCHEMA。0123如图5A所示,有如下的SQL脚本说明书CN102375826ACN102375833A9/15页120124CONNECTTOS020125INSERTINTOA02SELECTFROMS01A010126CONNECTTOS030127INSERTINTOA02SELECTFROMS01A010128如果不能识别数据库连接信息及其与SQL脚本的先后顺序,则有可能生成错误结果,错误的解析结果如图5A中的501所示为A02;而正确的解析结果应。

34、当如5A中的502所示的分别为S02A02和S03A03。01292当SQL脚本中存在对临时表的操作时,根据查询子句确定临时表的结构,根据所述临时表结构对所述SQL脚本进行上下文相关性分析。0130如果在一条SQL脚本中存在对临时表的操作,而且这个临时表是在该SQL脚本执行前创建的,那么这条SQL脚本的解析过程很可能需要依赖与创建临时表的SQL脚本所包含的信息。在经营分析系统中,有很多脚本程序通过一个查询子句创建临时表。这种情况需要根据该查询子句来确定临时表的结构,并将这些结构信息应用于后续SQL脚本的解析处理过程中。0131如图5B所示,有如下的SQL脚本0132SQL01CREATETAB。

35、LETAFA1,FA2;0133SQL02INSERTINTOTASELECTFB1,FB2FROMTB;0134如果不首先解析第一条SQL脚本,获取TA的库表结构,则TRANSFORMER对象的目标关系无法建立,错误的解析结果如图5B中的503所示;而正确的解析结果应当如5B中的504所示。0135如图5C所示,不预先处理临时表创建脚本也会引起的解析错误。0136有如下的SQL脚本0137SQL01CREATETABLETAFA1,FA2,FA3;0138SQL02INSERTINTOTAFA1,FA2SELECTFB1,FB2FROMTB;0139错误的解析结果如图5C中的505所示,缺少。

36、FA3字段;而正确的解析结果应当如5B中的506所示。01403对于命名空间信息的处理,识别SQL脚本中同一标识的数据库表的不同命名空间信息,对所述数据库表的标识增加相应的命名前缀,根据所述命名前缀对所述SQL脚本进行上下文相关性分析;0141在脚本程序中,一个数据库表的命名只能在一定范围内标识该数据库表,当这个命名超出该范围时,所标识的是其他数据库表,这个范围就称为命名空间。0142一般情况下,数据库表的命名空间会覆盖脚本程序的所有SQL脚本。但是,如果在脚本程序中存在RENAME句型的SQL脚本,或者DROP表操作的SQL脚本,则这些SQL脚本的上下文会影响数据库表的命名空间,甚至出现同一。

37、个命名有多个命名空间,分别标识多个不同的数据库表的情况。0143这种情况下,SQL脚本解析时需要识别同一标识的不同命名空间,通过对这个命名标识增加命名前缀来加以区分。0144数据库表命名空间与SQL脚本的关系如下01451、CREATE句型说明书CN102375826ACN102375833A10/15页130146是指在执行期间创建数据库表的SQL脚本。所创建的数据库表的命名对应一个新的命名空间。01472、RENAME句型0148SQL脚本RENAMETABLEA01TOA02影响两个数据库表的命名空间。其中A01的命名标识范围结束,A02创建一个新的命名空间。01493、DROP句型01。

38、50SQL脚本DROPTABLEA01令A01的命名标识范围结束。0151如图5D所示,有如下的SQL脚本0152SQL01CREATETABLETAASSELECTFROMTB0;/TA的NAMESPACE01开始0153SQL02RENAMETABLETATOTA0;/TA的NAMESPACE01结束0154/TA0的NAMESPACE01开始0155SQL03CREATETABLETAASSELECTFROMTB1;/TA的NAMESPACE02开始0156SQL04RENAMETABLETATOTA1;/TA的NAMESPACE02结束0157/TA1的NAMESPACE01开始015。

39、8不区分命名空间的情况下,将SQL01和SQL03所创建的TA视为同一张表,解析出错误的结果,如图5D中的507所示,事实上这两张表很可能具有不同的表结构;正确的解析结果如图5D中的508所示。01594当SQL脚本为循环时,将多个结构类似的SQL脚本识别为一个SQL脚本,并对该循环的SQL脚本进行上下文相关性分析。0160如果脚本程序中存在一个循环体内的SQL脚本,那么这个SQL脚本输出到运行日志后,可能会是多个结构类似的SQL脚本。对这批本来不是组合SQL脚本的组合SQL脚本进行处理时,需要将其识别为一个SQL脚本,解析生成的结果应该是一个SQL脚本的结构化描述结果。0161以下对上述步骤。

40、310进行具体举例说明,运行日志如下表3所示,0162表3说明书CN102375826ACN102375833A11/15页1401630164当解析处理该运行日志时,首先创建一个空的上下文相关信息,如下表4所示,0165表401660167依次解析运行日志中的每一条信息。01681、解析第一条0169CONNSCHEMAS01/CONN,0170这并不是一条SQL语句,而是一条上下文辅助信息,因此不生成语义结果集,其上下文类型属于改变数据库连接类型,针对这种上下文类型的处理,是将上下文环境中的缺省SCHEMA修改为新的SCHEMA,修改后的上下文相关信息如下表5所示。0171表5说明书CN1。

41、02375826ACN102375833A12/15页15017201732、解析第二条0174SQL0175CREATETABLETBB1INT,B2INT0176/SQL0177对这条SQL语句进行词法语法和语义分析后,其语义结果集是TB的表结构。结合当前的上下文相关信息,TB所属SCHEMA是S01,同时该SQL句型涉及临时表和命名空间的处理,需要将S01TB的表结构和命名空间登记到上下文相关信息中,如下表6所示。0178表6017901803、解析第三条0181SQL0182INSERTINTOTBSELECTFROMS02TA0183/SQL0184对这条SQL语句进行词法语法和语义。

42、分析后,其语义结果集是读取表S02TA的数据,写入TB中,这时要访问上下文相关信息,才能知道TB是属于命名空间01中的S01TB,其表结构是B1INT,B2INT。综合这些信息,可生成该SQL语句的元数据信息。0185这条SQL语句不需要更新上下文相关信息。01864、解析第四条0187CONNSCHEMAS02/CONN0188修改上下文相关信息中的缺省SCHEMA,如下表7所示0189表7说明书CN102375826ACN102375833A13/15页16019001915、解析第五条0192SQL0193RENAMES01TBTOS01TB010194/SQL0195该SQL语句的语义。

43、结构集,是将S01下的库表TB改名为TB01,生成改名的元数据信息。同时,这里涉及上下文相关信息中命名空间的变化,而TB01继承了TB的表结构,这个表结构需要从上下文相关信息中获得,此外,还要登记TB01的命名空间,为此要修改上下文相关信息,如下表8所示。0196表8019701986、解析第六条0199SQL0200CREATETABLES01TBB1STRING,B2STRING,B3STRING0201/SQL0202在S01下面创建库表TB,检查上下文相关信息得知,由于之前的S01TB的命名空间01已经结束,现在的TB要登记一个新的命名空间02,同时要将TB的表结构记录到上下文相关信息。

44、中,如下表9所示。0203表9说明书CN102375826ACN102375833A14/15页1702040205本实施例的SQL脚本解析方法,通过对SQL脚本进行词法、语法、语义以及上下文相关性分析,避免在生成SQL脚本的元数据时,数据流语义信息的丢失,从而提高获取SQL脚本的元数据的完整性和准确性,保证SQL脚本元数据的获取质量。另外,通过在运行日志中加入上下文辅助信息,在上下文相关性分析SQL脚本时,同时考虑该上下文辅助信息,能够更精确的判断SQL脚本与上下文的关系,进一步提高获取SQL脚本的元数据的完整性和准确性,保证SQL脚本元数据的获取质量。0206装置实施例0207如图6所示,。

45、本发明SQL脚本解析装置实施例包括0208提取模块602,用于按照运行日志中的SQL脚本执行顺序从运行日志中提取SQL脚本;0209词法、语法和语义分析模块,对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;0210上下文相关性分析模块610,用于根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。0211其中,词法分析模块604,用于读取所述SQL脚本的字符串,对字符串的字符序列进行单词提取,生成单词序列;0212语法分析模块606,用于分析所述。

46、单词序列的语法结构,生成语法树;0213语义分析模块608,用于遍历所述语法树,根据语法树中每个结点的语义和语法结构,生成所述SQL脚本的语义结果集。0214本实施例SQL脚本解析装置中,各模块的工作方式在上述方法实施例中已经详细说明,在此不再赘述。0215本实施例的SQL脚本解析装置,通过对SQL脚本进行词法、语法、语义以及上下文相关性分析,避免在生成SQL脚本的元数据时,数据流语义信息的丢失,从而提高获取SQL脚本的元数据的完整性和准确性,保证SQL脚本元数据的获取质量。0216系统实施例0217如图7所示,本发明SQL脚本解析系统实施例包括说明书CN102375826ACN1023758。

47、33A15/15页180218运行日志存储装置72,用于存储脚本程序运行时生成的运行日志;0219SQL脚本解析装置74,用于按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。0220其中,运行日志存储装置72,采用日志文件或日志表的方式存储所述运行日志。0221所述日志文件采用文本文件记录日志内容,对于所述脚本程序的每次运行,都在相。

48、应的目录下存储一个独立的日志文件,所述日志文件的文件名与所述脚本程序相对应。0222所述日志表采用数据库表记录日志内容,对于日志表的存储方式,存储运行日志总体表和运行日志明细表;都在所述运行日志总体表的每条记录,对应所述脚本程序的每次运行生成的一个运行日志;所述运行日志明细表对应所述运行日志的详细信息。0223优选地,运行日志中包括脚本程序中所有提交到数据库执行的SQL脚本及上下文辅助信息。SQL脚本解析装置74则进一步根据所述上下文辅助信息分析所述SQL脚本的上下文类型,生成上下文相关信息。0224如果采用文件目录方式,运行日志区可以分布在多台主机上。每台主机根据本机的脚本程序部署情况确定运。

49、行日志区的目录结构。脚本程序的运行日志输出到指定的目录中。SQL脚本解析装置的通过FTP方式访问运行日志存储装置。0225如果采用数据库表方式,运行日志区可以分布在多个不同的SCHEMA或者数据库服务器中。SQL脚本解析装置的通过JDBC连接数据库,访问运行日志区。0226本实施例的SQL脚本解析系统,通过对SQL脚本进行词法、语法、语义以及上下文相关性分析,避免在生成SQL脚本的元数据时,数据流语义信息的丢失,从而提高获取SQL脚本的元数据的完整性和准确性,保证SQL脚本元数据的获取质量。另外,通过在运行日志中加入上下文辅助信息,在上下文相关性分析SQL脚本时,同时考虑该上下文辅助信息,能够更精确的判断SQL脚本与上下文的关系,进一步提高获取SQL脚本的元数据的完整性和准确性,保证SQL脚本元数据的获取质量。0227应说明的是以上实施例仅用以说明本发明而非限制,本发明也并不仅限于上述举例,一切不脱离本发明的精神和范围的技术方案及其改进,其均应涵盖在本发明的权利要求范围中。说明书CN102375826ACN102375833A1/4页19图1图2图3说明书附图CN102375826ACN102375833A2/4页20图4图5A图5B说明书附图CN102375826ACN102375833A3/4页21图5C图5D图6说明书附图CN102375826。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1