Sql脚本解析方法、装置及系统的制作方法

文档序号:6607715阅读:206来源:国知局
专利名称:Sql脚本解析方法、装置及系统的制作方法
技术领域
本发明涉及一种元数据管理技术,尤其涉及一种SQL脚本解析方法、装置及系统。
背景技术
目前很多大型企业如通信、金融等行业的企业都已经建立了元数据管理系统,以加强对日益膨胀的数据仓库系统的有效管理。在这些元数据管理系统中,其中有大部分仍然采用手工整理方式管理SQL脚本元数据。而有些企业则在最近几年开始尝试一种SQL脚本元数据自动获取方案。这种方案基于编译技术,设法提取ETL和数据处理过程的SQL脚本,然后对这些SQL脚本进行词法、语法和语义分析,并将获得的SQL脚本数据流信息翻译成SQL脚本元数据。整个方案划分3个环节,在第一个环节中,目前获取SQL脚本的方式主要有三种, 包括直接从ETL和数据处理过程的程序代码中提取、从数据库日志中提取或者从ETL和数据处理过程的运行日志中提取。在第二个环节中,利用编译技术对提取出来的SQL脚本进行词法和语法分析,形成语法树,以此作为语义分析的基础。在第三个环节中,对SQL脚本的语法树进行语义分析。如果在语义分析过程中发现该SQL脚本包含完整的数据流语义信息,则将这些数据流语义翻译成元数据,否则不做翻译处理。如图1所示,将每个SQL脚本看出是一个数据流语义信息的独立载体,对每个SQL 脚本单独进行获取和处理,并生成该SQL脚本的元数据,而不需要考虑SQL脚本的上下文环
^Ml O现有方案是基于每条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是本发明语法树的示意图;图fe是本发明SQL脚本解析方法实施例中有无缺省数据库连接信息后SQL脚本分析结果对比示意图;图恥是本发明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)脚本程序名格式[PR0C]脚本程序名[/PR0C]。其中的脚本程序名是指脚本程序的文件名,为避免在不同路径下出现重名脚本程序名的情况,这里的文件名应包括文件路径。b)脚本程序版本号格式[VERSION]脚本程序版本号[/VERSION]其中的脚本程序版本号是一个字符串,格式不限。c)脚本程序最近修改时间格式[MODIFY DATE]脚本程序最近修改时间[/MODIFY DATE]其中的脚本程序最近修改时间是指脚本程序文件最后一次更新的时间,可以采用操作系统中记录的文件修改时间。时间格式yyyy-mm-dd hh24:mi:ssd)脚本程序本次运行的输入参数格式[PARA]参数描述串[/PARA]其中的参数描述串用于记录脚本程序本次运行时,从外部传进来的参数值,参数描述串的格式“参数名1 =参数值1 ;参数名2 =参数值2 ;......”。e)脚本程序本次运行的启动时间格式[BEGIN TIME]脚本程序本次运行的启动时间[/BEGIN TIME]
时间格式yyyy-mm-dd hh24:mi:ss2)文件体的格式要求文件体记录脚本程序运行时提交到数据库执行的所有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字段名字段内容数据类型说明Iogsn运行日志序号NUMBER关键字,每个运行日志对应一个唯一的运行日志序号。该序号按运行曰志生成的先后顺序递增。prog—name脚本程序名VARCHAR2(1000)是指脚本程序的文件名。为避免在不同路径下出现重名脚本程序名的情况,这里的文件名应包括文件路径。prog version脚本程序版本号VARCHAR2(100)标识脚本程序的版本,格式不限。modify _date脚本程序最近 务改时间DATETIME脚本程序文件最后一次更新的时间,可以采用操作系统中记录的文件修改时间。 时间格式 yyyy-mm-dd hh24:mi:ssinput_para脚本程序输入参数VARCHAR2(200)采用参数描述串记录脚本程序本次运行从外部输入的参数;参数描述串格式如下“参数名1=参数值 1;参数名2=参数值2;...”。begintime脚本程序启动时间DATETIME时间格式 yyyy-mm-dd hh24:mi:ssend_time脚本程序运行结束时间DATETIME当脚本程序的本次运行还没结束时,该字段为NULL。本次运行结束时,将结束时间填入。 时间格式 yyyy-mm-dd hh24:mi:ss运行日志明细表填写要求如下表2所示。表权利要求
1.一种SQL脚本解析方法,其特征在于,包括A、按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;B、对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;C、根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个 SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。
2.根据权利要求1所述的SQL脚本解析方法,其特征在于,所述步骤B具体包括 Bi、读取所述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脚本的上下文类型,生成上下文相关信息。
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脚本解析方法,包括A、按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;B、对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;C、根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。本发明的SQL脚本解析方法、装置及系统,通过对SQL脚本进行词法、语法、语义以及上下文相关性分析,避免在生成SQL脚本的元数据时,数据流语义信息的丢失,从而提高获取SQL脚本的元数据的完整性和准确性,保证SQL脚本元数据的获取质量。
文档编号G06F17/30GK102375826SQ20101025387
公开日2012年3月14日 申请日期2010年8月13日 优先权日2010年8月13日
发明者何鸿凌, 李政, 林旭, 薛勇, 陈仲亮, 陶涛, 魏春辉 申请人:中国移动通信集团公司, 广州石竹计算机软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1