CN102375826B - Sql脚本解析方法、装置及系统 - Google Patents
Sql脚本解析方法、装置及系统 Download PDFInfo
- Publication number
- CN102375826B CN102375826B CN201010253875.4A CN201010253875A CN102375826B CN 102375826 B CN102375826 B CN 102375826B CN 201010253875 A CN201010253875 A CN 201010253875A CN 102375826 B CN102375826 B CN 102375826B
- Authority
- CN
- China
- Prior art keywords
- sql script
- context
- sql
- script
- log
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种SQL脚本解析方法、装置及系统。其中SQL脚本解析方法,包括:A、按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;B、对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;C、根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息。本发明的SQL脚本解析方法、装置及系统,通过对SQL脚本进行词法、语法、语义以及上下文相关性分析,避免在生成SQL脚本的元数据时,数据流语义信息的丢失,从而提高获取SQL脚本的元数据的完整性和准确性,保证SQL脚本元数据的获取质量。
Description
技术领域
本发明涉及一种元数据管理技术,尤其涉及一种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脚本元数据的获取质量。
应说明的是:以上实施例仅用以说明本发明而非限制,本发明也并不仅限于上述举例,一切不脱离本发明的精神和范围的技术方案及其改进,其均应涵盖在本发明的权利要求范围中。
Claims (11)
1.一种SQL脚本解析方法,其特征在于,包括:
A、按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;
B、对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;
C、根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息;
所述方法还包括:
当所述运行日志中包括SQL脚本及上下文辅助信息时,进一步根据所述上下文辅助信息分析所述SQL脚本的上下文类型,生成上下文相关信息;
当所述上下文辅助信息包括缺省数据库连接信息时,根据所述缺省数据库连接信息确定每条SQL脚本的缺省schema;根据所述缺省schema获得数据库实体在原数据库中的定位;
当SQL脚本中存在对临时表的操作时,根据查询子句确定临时表的结构,根据所述临时表结构对所述SQL脚本进行上下文相关性分析;
识别SQL脚本中同一标识的数据库表的不同命名空间信息,对所述数据库表的标识增加相应的命名前缀,根据所述命名前缀对所述SQL脚本进行上下文相关性分析;
当SQL脚本为循环时,将多个结构类似的SQL脚本识别为一个SQL脚本,并对该循环的SQL脚本进行上下文相关性分析。
2.根据权利要求1所述的SQL脚本解析方法,其特征在于,所述步骤B具体包括:
B1、读取所述SQL脚本的字符串,对字符串的字符序列进行单词提取,生成单词序列;
B2、分析所述单词序列的语法结构,生成语法树;
B3、遍历所述语法树,根据语法树中每个结点的语义和语法结构,生成所述SQL脚本的语义结果集。
3.根据权利要求1所述的SQL脚本解析方法,其特征在于,所述运行日志采用日志文件或日志表的存储方式,
所述日志文件采用文本文件记录日志内容;所述日志表采用数据库表记录日志内容。
4.一种SQL脚本解析装置,其特征在于,包括:
提取模块,用于按照运行日志中的SQL脚本执行顺序从运行日志中提取SQL脚本;
词法、语法和语义分析模块,对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;
上下文相关性分析模块,用于根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息;
当所述运行日志中包括SQL脚本及上下文辅助信息时,所述上下文相关性分析模块,用于进一步根据所述上下文辅助信息分析所述SQL脚本的上下文类型,生成上下文相关信息;
当所述上下文辅助信息包括缺省数据库连接信息时,所述上下文相关性分析模块,用于根据所述缺省数据库连接信息确定每条SQL脚本的缺省schema;根据所述缺省schema获得数据库实体在原数据库中的定位;
所述上下文相关性分析模块,还用于当SQL脚本中存在对临时表的操作时,根据查询子句确定临时表的结构,根据所述临时表结构对所述SQL脚本进行上下文相关性分析;
所述上下文相关性分析模块,还用于识别SQL脚本中同一标识的数据库表的不同命名空间信息,对所述数据库表的标识增加相应的命名前缀,根据所述命名前缀对所述SQL脚本进行上下文相关性分析;
所述上下文相关性分析模块,还用于当SQL脚本为循环时,将多个结构类似的SQL脚本识别为一个SQL脚本,并对该循环的SQL脚本进行上下文相关性分析。
5.根据权利要求4所述的SQL脚本解析装置,其特征在于,
所述词法分析模块,用于读取所述SQL脚本的字符串,对字符串的字符序列进行单词提取,生成单词序列;
所述语法分析模块,用于分析所述单词序列的语法结构,生成语法树;
所述语义分析模块,用于遍历所述语法树,根据语法树中每个结点的语义和语法结构,生成所述SQL脚本的语义结果集。
6.一种SQL脚本解析系统,其特征在于,包括:
运行日志存储装置,用于存储脚本程序运行时生成的运行日志,存储脚本程序中所有提交到数据库执行的SQL脚本及上下文辅助信息;
SQL脚本解析装置,用于按照运行日志中的SQL脚本执行顺序,从运行日志中提取SQL脚本;对每条SQL脚本依次进行词法、语法和语义进行分析,生成SQL脚本的语义结果集;根据所述语义结果集分析所述SQL脚本的上下文类型,生成所述运行日志中各个SQL脚本之间的上下文相关信息,根据所述语义结果集和所述上下文相关信息获得所述运行日志的数据流信息;当所述运行日志中包括SQL脚本及上下文辅助信息时,进一步根据所述上下文辅助信息分析所述SQL脚本的上下文类型,生成上下文相关信息;当所述上下文辅助信息包括缺省数据库连接信息时,根据所述缺省数据库连接信息确定每条SQL脚本的缺省schema;根据所述缺省schema获得数据库实体在原数据库中的定位;当SQL脚本中存在对临时表的操作时,根据查询子句确定临时表的结构,根据所述临时表结构对所述SQL脚本进行上下文相关性分析;识别SQL脚本中同一标识的数据库表的不同命名空间信息,对所述数据库表的标识增加相应的命名前缀,根据所述命名前缀对所述SQL脚本进行上下文相关性分析;当SQL脚本为循环时,将多个结构类似的SQL脚本识别为一个SQL脚本,并对该循环的SQL脚本进行上下文相关性分析。
7.根据权利要求6所述的SQL脚本解析系统,其特征在于,所述运行日志存储装置,采用日志文件或日志表的方式存储所述运行日志,
所述日志文件采用文本文件记录日志内容;所述日志表采用数据库表记录日志内容。
8.根据权利要求7所述的SQL脚本解析系统,其特征在于,
所述运行日志存储装置,对于所述脚本程序的每次运行,都在相应的目录下存储一个独立的日志文件,所述日志文件的文件名与所述脚本程序相对应。
9.根据权利要求7所述的SQL脚本解析系统,其特征在于,
所述运行日志存储装置,对于日志表的存储方式,存储运行日志总体表和运行日志明细表;都在所述运行日志总体表的每条记录,对应所述脚本程序的每次运行生成的一个运行日志;所述运行日志明细表对应所述运行日志的详细信息。
10.根据权利要求6所述的SQL脚本解析系统,其特征在于,所述运行日志存储装置分布在不同的schema或数据库服务器中。
11.根据权利要求6所述的SQL脚本解析系统,其特征在于,所述SQL脚本解析装置,通过FTP方式或JDBC访问所述运行日志存储装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010253875.4A CN102375826B (zh) | 2010-08-13 | 2010-08-13 | Sql脚本解析方法、装置及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201010253875.4A CN102375826B (zh) | 2010-08-13 | 2010-08-13 | Sql脚本解析方法、装置及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102375826A CN102375826A (zh) | 2012-03-14 |
CN102375826B true CN102375826B (zh) | 2014-12-31 |
Family
ID=45794450
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010253875.4A Active CN102375826B (zh) | 2010-08-13 | 2010-08-13 | Sql脚本解析方法、装置及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102375826B (zh) |
Families Citing this family (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102750374A (zh) * | 2012-06-20 | 2012-10-24 | 深圳市远行科技有限公司 | 一种基于数据库脚本的数据追溯和影响关系的分析方法 |
CN103077064B (zh) * | 2012-12-31 | 2016-03-02 | 北京配天技术有限公司 | 一种解析并执行程序语言方法及解释装置 |
US9596279B2 (en) * | 2013-02-08 | 2017-03-14 | Dell Products L.P. | Cloud-based streaming data receiver and persister |
CN103678630A (zh) * | 2013-12-19 | 2014-03-26 | 北京用友政务软件有限公司 | 一种数据库监控方法及系统 |
CN103744968A (zh) * | 2014-01-09 | 2014-04-23 | 小米科技有限责任公司 | 一种终端应用中的信息推送方法及装置 |
CN105302842A (zh) * | 2014-07-31 | 2016-02-03 | 北大方正集团有限公司 | 一种数据处理方法及装置 |
CN104391928B (zh) * | 2014-11-21 | 2018-08-28 | 用友网络科技股份有限公司 | 动态构建多维模型定义的装置和方法 |
CN104391995A (zh) * | 2014-12-15 | 2015-03-04 | 北京趣拿软件科技有限公司 | 一种sql语句审核的方法、数据库运维的方法及系统 |
CN106776639B (zh) * | 2015-11-24 | 2020-04-10 | 腾讯科技(深圳)有限公司 | 基于结构化查询语言的数据处理方法及数据处理装置 |
CN105488170B (zh) * | 2015-11-30 | 2019-02-12 | 金蝶软件(中国)有限公司 | 一种erp系统的信息管理方法及装置 |
CN107292170B (zh) * | 2016-04-05 | 2021-06-22 | 阿里巴巴集团控股有限公司 | Sql注入攻击的检测方法及装置、系统 |
US10650007B2 (en) * | 2016-04-25 | 2020-05-12 | Microsoft Technology Licensing, Llc | Ranking contextual metadata to generate relevant data insights |
CN108255837B (zh) * | 2016-12-28 | 2020-09-04 | 中国移动通信集团浙江有限公司 | 一种sql解析器及方法 |
CN107391384A (zh) * | 2017-08-14 | 2017-11-24 | 中国银行股份有限公司 | 一种sql语句检测方法及系统 |
CN107704453B (zh) * | 2017-10-23 | 2021-10-08 | 深圳市前海众兴科研有限公司 | 一种文字语义分析方法、文字语义分析终端及存储介质 |
CN108388547A (zh) * | 2018-02-24 | 2018-08-10 | 平安科技(深圳)有限公司 | 字符串解析方法、装置、设备及计算机可读存储介质 |
CN108536745B (zh) * | 2018-02-24 | 2021-03-16 | 平安科技(深圳)有限公司 | 基于Shell的数据表提取方法、终端、设备及存储介质 |
CN109710635B (zh) * | 2018-12-29 | 2021-03-19 | 联想(北京)有限公司 | 用于数据库的处理方法、处理系统以及服务器组 |
CN110688354B (zh) * | 2019-09-30 | 2022-05-03 | 深圳证券交易所 | 数据库中慢日志文件的分析方法、终端以及存储介质 |
CN115185525B (zh) * | 2022-05-17 | 2023-07-18 | 贝壳找房(北京)科技有限公司 | 数据倾斜代码块定位方法、装置、设备及介质 |
-
2010
- 2010-08-13 CN CN201010253875.4A patent/CN102375826B/zh active Active
Non-Patent Citations (2)
Title |
---|
基于Oracle日志分析的数据还原操作的设计及实现;秦森等;《电脑知识与技术(学术交流)》;20071231(第3期);626-628 * |
谢美意等.DM4过程SQL语言的设计与实现.《华中科技大学学报(自然科学版)》.2006,第34卷(第3期),14-16. * |
Also Published As
Publication number | Publication date |
---|---|
CN102375826A (zh) | 2012-03-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102375826B (zh) | Sql脚本解析方法、装置及系统 | |
KR101204128B1 (ko) | 고성능의 구조적 데이터 변환을 위한 하드웨어/소프트웨어파티션 | |
CN106897322B (zh) | 一种数据库和文件系统的访问方法和装置 | |
US7290012B2 (en) | Apparatus, system, and method for passing data between an extensible markup language document and a hierarchical database | |
KR101129083B1 (ko) | 표현 그룹화 및 평가 | |
US7831540B2 (en) | Efficient update of binary XML content in a database system | |
KR101110988B1 (ko) | 구조적 데이터 변환을 위한 장치 | |
CN109840256B (zh) | 一种基于业务实体的查询实现方法 | |
US20050039117A1 (en) | Method, system, and computer program product for comparing two computer files | |
US7539701B2 (en) | Generic infrastructure for migrating data between applications | |
CA2500422A1 (en) | Annotated automaton encoding of xml schema for high performance schema validation | |
CN111913739B (zh) | 一种服务接口原语定义方法和系统 | |
US7636656B1 (en) | Method and apparatus for synthesizing multiple localizable formats into a canonical format | |
CN112235311A (zh) | Ovsdb客户端代码自动生成方法、系统、设备及介质 | |
US6915313B2 (en) | Deploying predefined data warehouse process models | |
CN102279886B (zh) | 元数据处理方法及设备 | |
US8086561B2 (en) | Document searching system and document searching method | |
CN116521621A (zh) | 一种数据处理方法、装置、电子设备及存储介质 | |
US20060218158A1 (en) | Translation of information between schemas | |
US7631003B2 (en) | Automated transformation for style normalization of schemas | |
US8032521B2 (en) | Managing structured content stored as a binary large object (BLOB) | |
CN118245050B (zh) | 前端框架组件自动转换方法、系统、电子设备及存储介质 | |
Guo et al. | RED: Redundancy-Driven Data Extraction from Result Pages? | |
CN114064007A (zh) | 程序语句处理方法、装置、设备及存储介质 | |
CN113448563A (zh) | 一种LaTeX在线协作平台 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |