语句块执行计划的生成方法、装置、设备和存储介质与流程

文档序号:22627466发布日期:2020-10-23 19:36阅读:117来源:国知局
本发明涉及数据库
技术领域
:,尤其涉及一种语句块执行计划的生成方法、装置、设备和存储介质。
背景技术
::为了保证数据库中所存储数据的安全性,越来越多的数据库开始使用行级安全策略。在执行结构化查询语言(structuredquerylanguage,sql)语句时,当sql语句访问的数据库对象关联安全策略函数时,现有技术会在语义分析阶段对语句块中包含的数据库对象关联有安全策略函数的sql语句进行改写,在sql语句中增加谓词,并基于改写后的目标sql语句生成目标执行计划。例如,假设存在表t(idint,pidint),表t存在安全策略函数p1,待执行原始sql语句为“select*fromtobj,tp_objwhereobj.pid=p_obj.id”,则现有技术会在语义分析阶段将该待执行原始sql语句改写为“select*from(select*fromtwhere“p1对应的谓词”)obj,(select*fromtwhere“p1对应的谓词”)p_objwhereobj.pid=p_obj.id”。当sql语句访问的数据库对象关联安全策略函数时,下列三种情况可能导致安全策略函数的谓词发生改变:第一,alter或者createorreplace语句修改安全策略函数的定义;第二,为数据库对象添加新的安全策略函数,或者删除数据库对象已关联的安全策略函数;第三,安全策略函数中存在if或casewhen等条件子句,或者,引用了数据库运行环境中的信息或当前会话中的信息,即安全策略函数中引用了可能随着数据库服务器的运行时刻发生变化的信息。第三条比前两条更容易引发数据库对象的安全策略函数对应的谓词发生变化,相同的sql语句执行计划可能会因为谓词的不同而生成完全不同的执行计划,错误使用相同sql语句的执行计划,会导致返回执行结果错误。因此,为了保证sql语句结果正确性,一旦sql语句访问的数据库对象关联安全策略函数时,则sql语句的执行计划不能重用。当在语句块包含多条sql时,如函数function(或过程procedure)定义体或者包package定义体中,在复杂的应用中一个定义体中可能包含成千上万条sql语句,如果只是其中一条或几条sql语句与安全策略函数相关就导致整个定义体的执行计划不能重用的话,则定义体每次都需要重新解析整个语句块获取执行计划,代价是相当巨大的,而且一个过程可能重复调用多次或者互相引用。在实际应用场景中发现,由于语句块过于庞大且涉及了关联安全策略函数的数据库对象,导致整体计划不能重用,多次重复解析语句块耗费大量时间。从上可知,为了确保执行结果的正确性,当语句块中包含访问的数据库对象关联有安全策略函数的sql语句时,采用现有技术生成的语句块的执行计划是不可重复利用的。技术实现要素:有鉴于此,本发明实施例提供一种语句块执行计划的生成方法、装置、设备和存储介质,从而当语句块中包含访问的数据库对象关联有安全策略函数的sql语句时,生成能够重复利用的执行计划。第一方面,本发明实施例提供了一种语句块执行计划的生成方法,包括:获取当前语句块;将所述当前语句块中关联有安全策略函数的第一语句改写为第二语句,其中,所述第一语句为插入语句、更新语句、删除语句或查询语句,所述第二语句为动态执行语句;基于所述第一语句改写后得到的目标语句块生成所述当前语句块的目标执行计划。第二方面,本发明实施例提供了一种语句块执行计划的生成装置,包括:语句块获取模块,用于获取当前语句块;语句改写模块,用于将所述当前语句块中关联有安全策略函数的第一语句改写为第二语句,其中,所述第一语句为插入语句、更新语句、删除语句或查询语句,所述第二语句为动态执行语句;计划生成模块,用于基于所述第一语句改写后得到的目标语句块生成所述当前语句块的目标执行计划。第三方面,本发明实施例提供了一种计算机设备,包括:一个或多个处理器;存储器,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如本发明实施例所述的语句块执行计划的生成方法。第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现如本发明实施例所述的语句块执行计划的生成方法。在上述生成语句块执行计划的技术方案中,获取当前语句块,将当前语句块中关联有安全策略函数的插入语句、更新语句、删除语句和查询语句改写为动态执行语句,并根据改写后得到的目标语句块生成当前语句块的目标执行计划。本发明实施例通过采用上述技术方案,由于生成的目标执行计划中并不包含访问关联有安全策略函数的数据库对象的执行计划,因此,能够使得所生成的目标执行计划在第一语句关联任意安全策略函数以及在任意执行环境中都能够返回正确的执行结果,实现包含关联安全策略函数的第一语句的语句块的目标执行计划的重用。附图说明通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:图1为本发明实施例一提供的一种语句块执行计划的生成方法的流程示意图;图2为本发明实施例一提供的一种当前语句块中的第一语句的改写过程的流程示意图;图3为本发明实施例二提供的一种语句块执行计划的生成方法的流程示意图;图4为本发明实施例三提供的一种语句块执行计划的生成装置的结构框图;图5为本发明实施例四提供的一种计算机设备的结构示意图。具体实施方式下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容。此外,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合实施例一本发明实施例一提供一种语句块执行计划的生成方法。该方法可以由语句块执行计划的生成装置执行,其中,该装置可以由软件和/或硬件实现,一般可集成在计算机设备的,典型的,可以集成在承载有数据库的计算机设备中。图1是本发明实施例一提供的一种语句块执行计划的生成方法的流程示意图,如图1所示,该方法包括:s110、获取当前语句块。具体的,数据库所对应的服务器接收到客户端发送的sql语句,此sql语句可能是简单的单条sql语句,如插入insert语句、更新update语句、删除delete语句、查询select语句;也可能是begin...end包裹的语句块,该语句块可能嵌套其它语句块;还可能是函数function(或过程procedure)定义体或者包package定义体中已定义方法的调用。服务器逐条解析已接收到的sql语句,若所解析的当前sql语句是语句块中的sql语句,则将该语句块确定为当前语句块;以及,若所解析的当前sql语句访问的数据库对象是函数或包方法等,则在解析数据库对象时,将该数据库对象的创建定义体确定为当前语句块。其中,当前语句块可以理解为数据库服务器当前需要解析的语句块,可以基于语句块的开始标志确定语句块的起始位置,并基于语句块的结束标志确定语句块的终止位置。在此,语句块的开始标志可以为“begin”或“{”等,语句块的结束标志可以为“end”或“}”等。s120、将所述当前语句块中关联有安全策略函数的第一语句改写为第二语句,其中,所述第一语句为插入语句、更新语句、删除语句或查询语句,所述第二语句为动态执行语句。其中,第一语句关联有安全策略函数可以理解为第一语句访问的数据库对象关联有安全策略函数,该数据库对象包括但不限于表、视图以及表示表或视图的同义词。待改写的第一语句需要满足以下条件:第一,语句类型为插入insert、更新update或删除delete等dml语句,或者为select查询语句;第二,访问的数据库对象关联有安全策略函数。第二语句可以是将第一语句改写后得到的动态执行语句。即当数据库对象关联安全策略函数时,若对该数据库对象进行插入(insert)、删除(delete)、更新(update)和查询(select)操作时,需要对当前用户能够访问和修改的数据做行级过滤。在此,安全策略函数返回结果可作为数据库对象的行级过滤谓词。具体的,可以针对当前语句块中的每一条sql语句,判断当前sql语句的语句类型是否为插入insert语句、更新update语句、删除delete语句或者select查询语句,若否,则确定该sql语句不为待改写的第一语句;若是,则进一步判断该sql语句访问的数据库对象是否关联有安全策略函数,若否,则确定该sql语句不为待改写的第一语句;若是,则确定该sql语句为待改写的第一语句,并将该第一语句改写为第二语句,即将该sql语句由静态sql语句改写为动态执行语句。图2为本发明实施例一提供的一种当前语句块中的第一语句的改写过程的流程示意图,请参见图2,所述将所述当前语句块中关联安全策略函数的第一语句改写为第二语句,可以优化为包括下述步骤:s1201、将所述当前语句块的引用安全策略函数标识置为false,并按照执行顺序将所述当前语句块中的第一条sql语句确定为当前sql语句。其中,引用安全策略函数标识(如,可记为“ref_rls”)可以理解为表示当前语句块中当前正在处理的sql语句(即当前sql语句)是否为需要改写为动态执行语句的标识。在本实施方式中,可以默认将当前语句块的引用安全策略函数标识置为false,并可以在确定当前sql语句为待改写的第一语句时,将当前语句块的引用安全策略函数标识由false修改为ture,以表示在当前sql语句语义解析完成后,需要进一步将当前sql语句改写为动态执行语句。在本实施例中,引用安全策略函数标识“ref_rls”可以存放在当前语句块上,也可以存放在当前sql语句上。若引用安全策略函数标识“ref_rls”存放在每条sql语句上则不需要进行重置。但是,由于语句块的sql语句是逐条解析的,因此,语句块中的所有sql语句优选可以共用同一个引用安全策略函数标识“ref_rls”,即可以不为每条sql语句都添加一个引用安全策略函数标识“ref_rls”。当语句块中的所有sql语句共用同一个引用安全策略函数标识“ref_rls”时,即当引用安全策略标识“ref_rls”存放在当前语句块上时,解析下一条语句前可以将该引用安全策略标识“ref_rls”重置为false。s1202、解析所述当前sql语句,并判断所述当前sql语句是否为第一语句,若是,则执行s1203;若否,则执行s1204。具体地,对当前sql语句进行语义解析,例如,判断当前sql语句的语句类型是否为插入insert语句、更新update语句、删除delete语句或者select查询语句;以及,判断当前sql语句访问的数据库对象是否关联有安全策略函数。若当前sql语句的语句类型为插入insert语句、更新update语句、删除delete语句或者select查询语句且当前sql语句访问的数据库对象关联有安全策略函数,则将当前sql语句确定为待改写的第一语句。其中,当前sql语句访问的数据库对象是否关联有安全策略函数可以通过查询数据库的行级安全相关系统表确定,该行级安全的系统表中记录有数据库中各数据库对象与安全策略函数之间的关联关系。当访问的数据对象为行级安全的系统表中记录的数据库对象时,可以将其关联的安全策略函数作为新的谓词,对该数据库对象可访问的数据进行级过滤。s1203、将所述当前语句块的引用安全策略函数标识置为ture。具体的,当判定当前sql语句为待改写的第一语句时,不对当前sql语句访问的数据库对象关联的安全策略函数的谓词进行处理,只是将当前语句块的引用安全策略函数标识由false修改为ture,用以表示当前sql语句需要被改写为动态执行语句。在本步骤中,具体地,当确定当前sql语句满足被改写的sql语句类型后,可以优先检查当前sql语句访问的数据库对象,确定所查找的数据库对象是否关联安全策略函数,若是,则将所述当前语句块的引用安全策略函数标识置为ture,并跳过当前sql语句访问的数据库对象关联的安全策略函数的谓词处理操作;若否,则引用安全策略函数标识置仍然保持为false,用以表示所述当前sql语句不关联任何安全策略函数,不需要考虑安全策略函数的谓词处理。在本步骤中,与常规处理不同。常规处理中,若所述当前sql语句访问的数据库对象关联安全策略函数时,则立即处理对应数据库对象的安全策略函数的谓词。当然,若常规处理不考虑当前sql语句所属的语句块的执行计划重用时,也可以立即处理安全策略函数的谓词。只是由于数据库关联安全策略函数的谓词随时可能发生变化,因此这样为语句块生成的执行计划是无法重用的。为了使语句块的计划能够重用,本步骤在当前sql语句关联安全策略函数时,只是将当前语句块的引用安全策略函数标识由false修改为ture,跳过了当前sql语句访问的数据库对象关联的安全策略函数的谓词处理。当前sql改写为动态执行语句后,在执行动态执行语句的执行计划时,才实时解析动态执行语句的执行计划中包含的sql语句,并立即处理该sql语句访问的数据库对象关联的安全策略函数的谓词。s1204、继续解析所述当前sql语句,直至所述当前sql语句解析完成。具体的,在将当前语句块的引用安全策略函数标识置为ture后,判断当前sql语句是否解析完成,若是,则执行s1205;若否,则继续解析当前sql语句,直至当前sql语句解析完成为止。s1205、判断所述当前语句块的引用安全策略函数标识是否为ture,若是,则执行s1206;若否,则执行s1207。具体的,在当前sql语句解析完成后,根据当前语句块的引用安全策略函数标识确定当前sql语句是否为待改写的原始sql语句,若当前语句块的引用安全策略函数标识为ture,则说明当前sql语句为待改写的第一语句;若当前语句块的引用安全策略函数标识仍为false,则说明当前sql语句访问的数据库对象不关联任何安全策略函数,从而后续不需要考虑再将其改写为动态执行语句。s1206、将所述当前sql语句改写为动态执行语句,并将所述当前语句块的引用安全策略函数标识重置为false。动态执行语句由sql语句、using子句和into子句三部分组成,在将关联安全策略函数的第一语句改写为动态执行语句时,转换规则可以描述如下:当第一语句已经包含into子句时,将第一语句的into子句转换为动态执行语句的into子句;当第一语句引用了当前语句块或上层可见语句块中声明的变量或参数时,将第一语句引用的这些变量或参数转换为动态执行语句的执行参数,并添加到新生成动态执行语句的using子句中。示例性的,假设用户user01下创建数据库对象表t,表t定义如下:createtableuser01.t(idint,pidint);数据准备如下:insertintotvalues(10,null);insertintotvalues(20,10);insertintotvalues(101,20);假设表t关联安全策略函数p1,最简单的,当第一语句没有引用变量也没有into子句时,如当当前sql语句为“select*fromtobj,tp_objwhereobj.pid=p_obj.id”时,则可以将其改写动态执行语句为“executeimmediate'select*fromtobj,tp_objwhereobj.pid=p_obj.id'”。当待改写的插入insert语句、更新update语句、删除delete语句或者select查询语句引用了语句块中的变量时,则可以转换为using子句;当待改写的语句为select...into时,还可以将第一语句中的into子句,转换为动态执行语句的into子句。示例性的,假设将执行的语句块如下:declaremax_idint;new_idint=50;new_pidint=10;beginselectmax(id)intomax_idfromtwherepid<new_pid;deletefromtwhereid=max_id;insertintotvalues(new_id,new_pid);end;其中,select查询语句“selectmax(id)intomax_idfromtwherepid<new_pid;”包含into子句,并引用了语句块定义的变量new_pid,改写为动态执行语句的三大组成部分可以分别为:sql语句为“selectmax(id)fromtwherepid<?”;using子句中包含变量new_pid;into子句中包含变量max_id。动态执行语句等价于执行语句“executeimmediate'selectmax(id)fromtwherepid<?'intomax_idusingnew_pid;”。其中,delete删除语句“deletefromtwhereid=max_id;”引用了语句块定义的变量max_id,改写为动态执行语句的三大组成部分分别为:sql语句为“deletefromtwhereid=?”;using子句中包含变量max_id;into子句为空,动态执行语句等价于执行语句“executeimmediate'deletefromtwhereid=?'usingmax_pid;”。其中,insert插入语句“insertintotvalues(new_id,new_pid);”中引用了语句块定义的变量new_id和new_pid,改写为动态执行语句的三大组成部分分别为:sql语句为“insertintotvalues(?,?)”;using子句中包含变量new_id和new_pid两个变量;into子句为空。动态执行语句等价于执行语句“executeimmediate'insertintotvalues(?,?)'usingnew_id,new_pid;”。其中,动态执行语句的三大组成部分中的sql语句中的“?”表示执行参数,或者也可以用“:<参数序号>”表示,如“:<1>”表示第一个执行参数。改写后的第二语句块等价于下列语句:declaremax_idint;new_idint=50;new_pidint=10;beginexecuteimmediate'selectmax(id)fromtwherepid<?'intomax_idusingnew_pid;executeimmediate'deletefromtwhereid=?'usingmax_id;executeimmediate'insertintotvalues(?,?)'usingnew_id,new_pid;end;s1207、判断所述当前语句块中是否存在下一条sql语句,若是,则执行s1208;若否,则结束操作。s1208、将下一条sql语句确定为当前sql语句,返回执行s1202。在本实施例中,在当前sql语句为插入insert语句、更新update语句、删除delete语句或者select查询语句,并存在于语句块中时,若访问的数据库对象关联安全策略函数,则需要考虑整个语句块的计划重用的问题,因此将当前sql语句改写为动态执行语句,并跳过当前sql语句访问的数据库对象关联的安全策略函数的谓词处理,在执行动态执行语句的对应执行计划时,才实时解析动态执行语句的执行计划中包含的sql语句,并处理该sql语句访问的数据库对象关联的安全策略函数的谓词。而当这类语句不在语句块中,作为单条sql语句存在时,则不需要考虑语句块计划重用问题,因此不需要考虑将第一语句改写为动态执行语句。为了区分这两种情况,添加语句块行级安全标识(如可记为“block_rls”),当“block_rls”设置为ture时,表示正在解析语句块,需要考虑语句改写为动态执行语句;否则,则在解析当前sql语句时,不需要考虑将语句改写为动态执行语句,而是立即处理访问的数据库对象的安全策略函数的谓词。语句块行级安全标识“block_rls”初值为false,当解析的语句为语句块时,如:解析到语句块的开始标志“begin”或“{”时,则将语句块行级安全标识“block_rls”设置为true;待当前语句块解析结束时,如:解析到语句块的结束标志“end”或“}”时,则将语句块行级安全标识“block_rls”重置为false。单条语句时,则语句块行级安全标识“block_rls”恒为false。s130、基于所述第一语句改写后得到的目标语句块生成所述当前语句块的目标执行计划。在本步骤中,由于改写后,当前语句块中的第一语句变为了动态执行语句,数据库在基于第一语句改写后得到的目标语句块生成当前语句块的目标执行计划时,不会再生成第一语句的执行计划,从而,所生成的目标执行计划中不再包含该第一语句的执行计划,而只是包含了改写后的第二语句的动态执行指令和当前尚未解析的动态sql原始字符串,因此,目标执行计划的执行结果不会受到第一语句所关联的安全策略函数和当前语句块的执行环境的影响,实现目标执行计划的重用。所述目标执行计划中包含关联安全策略函数的第一语句改写后的动态执行语句的执行计划在执行时才会对动态执行语句的执行计划中包含的sql语句进行语义解析,当该sql语句访问的数据库对象关联安全策略函数时,则立即处理对应数据库对象的安全策略函数的谓词。由于动态执行语句的执行计划中包含的sql生句生成的执行计划是根据当前数据库服务器的环境实时生成的执行计划,不在语句块的整体执行计划中,因此能够保证语句块的执行计划能重复使用。本发明实施例一提供的语句块执行计划的生成方法,获取当前语句块,将当前语句块中关联有安全策略函数的插入语句、更新语句、删除语句和查询语句改写为动态执行语句,并根据改写后得到的目标语句块生成当前语句块的目标执行计划。本实施例通过采用上述技术方案,由于生成的目标执行计划中并不包含访问关联有安全策略函数的数据库对象的执行计划,因此,能够使得所生成的目标执行计划在第一语句关联任意安全策略函数以及在任意执行环境中都能够返回正确的执行结果,实现包含关联有安全策略函数的第一语句的语句块的目标执行计划的重用。实施例二图3为本发明实施例二提供的一种语句块执行计划的生成方法的流程示意图。本实施例二在上述实施例一的基础上进行优化,进一步地,在所述基于改写后的所述当前语句块的第二语句块生成执行计划之后,还包括:依据所述目标执行计划执行所述当前语句块。进一步地,在所述基于所述第一语句改写后得到的所述目标语句块生成所述当前语句块的目标执行计划之后,还包括:将所述当前语句块与所述目标执行计划对应存储于承载有所述当前数据库的计算机设备中。进一步地,在所述将所述当前语句块中关联有安全策略函数的第一语句改写为第二语句之前,还包括:确定承载有所述当前数据库的计算机设备中未存储与所述当前语句块相同的历史语句块。进一步地,所述语句块执行计划的生成方法,还包括:如果承载有所述当前数据库的计算机设备中存储有与所述当前语句块相同的历史语句块,则获取所述历史语句块的执行计划,作为所述当前语句块的目标执行计划。相应的,如图3所示,本实施例提供的语句块执行计划的生成方法包括:s210、获取当前语句块。s220、判断承载有所述当前数据库的计算机设备中是否存储有与所述当前语句块相同的历史语句块,若是,则执行s230;若否,则执行s240。其中,历史语句块可以理解为承载有执行当前语句块的当前数据库的计算机设备中存储的、与当前语句块相同的语句块。承载有当前数据库的计算机设备中存储的各语句块可以为该计算机在执行当前语句块之前执行过的语句块,即计算机在首次执行某一个语句块时,可以生成该语句块的执行计划,并对应存储将该语句块与该语句块的执行计划,以便后续使用。需要说明的是,由于当用户不同时,同一sql语句的数据库对象所关联的安全策略函数可能是不相同的,因此,本实施例所提及的计算机设备中存储的语句块优选为计算机设备中存储的且语句块的请求执行方与当前语句块的请求执行方相同的语句块,以确保当前语句块执行结果的准确性。在本步骤中,可以通过文字识别的方式判断承载有当前数据库的计算机设备中是否存储有与当前语句块相同的历史语句块。具体的,可以依次将当前数据块与计算机设备中存储的各语句块进行对比,或者将当前数据库同时与计算机设备中存储的多个语句块进行对比,从而确定计算机设备中是否存储有与当前语句块相同的语句块。在对比时,针对计算机设备中存储的每一个语句块,可以按照由前向后的顺序依次解析该语句块与当前语句块中的各字符,对比各字符是否相同,若各字符均相同,则确定该语句块为与当前语句块相同的历史语句块,并执行s230;否则,则确定该语句块不为与当前语句块相同的历史语句块。s230、获取所述历史语句块的执行计划,作为所述当前语句块的目标执行计划,执行s270。在本步骤中,由于计算机设备中的各语句块与各语句块的执行计划对应存储,因此,在确定计算机设备中存储有与当前语句块相同的历史语句块之后,可以依据该历史语句块与其语句块的执行计划的对应关系,获取该历史语句块的执行计划,并将该历史语句块的执行计划确定为当前语句块的目标执行计划,从而,无需再对当前语句块进行语义解析,也无需再次重复生成当前语句块的目标执行计划,实现关联有安全策略函数的第一语句的语句块的执行计划的重用。s240、将所述当前语句块中关联有安全策略函数的第一语句改写为第二语句,其中,所述第一语句为插入语句、更新语句、删除语句或查询语句,所述第二语句为动态执行语句。s250、基于所述第一语句改写后得到的目标语句块生成所述当前语句块的目标执行计划。s260、将所述当前语句块与所述目标执行计划对应存储于承载有所述当前数据库的计算机设备中。具体的,可以将当前语句块与当前语句块的所述目标执行计划对应存储于承载有当前数据库的计算机设备的缓存或内存中,优选可以存储于计算机设备的缓存中。由于计算机设备中对应存储了当前语句块和目标执行计划,因此,当相同的语句块多次重复执行时,计算机设备能够直接获取计算机设备中存储的该语句块的执行计划,并基于该执行计划执行该语句块,从而实现语句块的执行计划的重复使用。其中,在对应存储当前语句块与当前语句块的所述目标执行计划时,可以将当前语句块与所述目标执行计划对应存储于计算机设备的同一存储空间中;也可以将当前语句块与所述目标执行计划存储于计算机设备的不同存储空间中,并将二者的存储空间相关联;还可以将当前语句块与所述目标执行计划存储于计算机设备的不同存储空间中,并将二者的存储空间或者二者的身份id对应存储于预先设置的对应关系表中。其中,基于当前语句块的身份id可以获取到当前语句块,即可以确定当前语句块的存储位置;基于所述目标执行计划的身份id可以获取到目标执行计划。s270、依据所述目标执行计划执行所述当前语句块。所述目标执行计划中包含关联安全策略函数的第一语句改写后的动态执行语句的执行计划,动态执行语句的执行计划中包含的sql语句在执行时才对该语句进行语义解析,当确定该sql语句访问的数据库对象关联安全策略函数时,立即处理对应数据库对象的安全策略函数的谓词。由于动态执行语句的执行计划中包含的sql语句生成的执行计划是根据当前数据库服务器的环境实时生成的执行计划,不在语句块的整体执行计划中,因此能够保证语句块的执行计划能重复使用。具体的,依据目标执行计划依次执行当前语句块,并在执行到目标执行计划中的第一语句对应的动态执行语句的执行计划时,依据动态执行语句的执行计划中的动态执行指令和动态sql原始字符串,解析动态sql原始字符串,生成该sql语句的执行计划,依据该执行计划执行该语句,基于此,由于在执行阶段才生成动态执行语句的执行计划中包含的sql语句的执行计划,当第一语句所关联的安全策略函数和当前语句块的执行环境发生变化时,所述动态执行语句的执行计划中包含的sql语句的执行计划也会相应改变,能够保证当前语句块的执行计划重用时执行结果的准确性。本实施例中,在生成当前语句块的目标执行计划时,还可以同时生成并存储当前语句块中各静态sql语句的语句执行计划,以便在后续接收到待执行sql语句时,可以直接调用所存储的执行计划执行该待执行sql语句。具体的,可以基于当前语句块中包含的各sql语句生成并存储当前语句块中各静态sql语句的独立执行计划,将所生成的各静态sql语句的执行计划的可重用标识设置为ture,并将关联有安全策略函数的sql语句的可重用标识设置为false。执行计划可重用标识为true时,会将原始sql语句和sql语句对应的执行计划存储在所述当前数据库的计算机设备中;否则,则不进行存储。从而,在接收到新的待执行sql语句时,将该待执行sql语句与计算机设备中存储的各sql语句进行对比,如果计算机设备中存在与该待执行sql语句相同的目标sql语句,则获取计算机设备中存储的该目标sql语句的执行计划,并依据该执行计划执行该待执行sql语句;如果计算即设备中不存在与该待执行sql语句相同的目标sql语句,则生成该待执行sql语句的执行计划,并依据该执行计划执行该待执行sql语句。本发明实施例二提供的语句块执行计划的生成方法,在计算机设备中存在与当前语句块相同的目标语句块时,直接采用计算机设备中存储的目标语句块的执行计划作为当前语句块的目标执行计划,并依据该目标执行计划执行当前语句块,而无需再对当前语句块进行语义解析,也无需再次重复生成当前语句块的目标执行计划,能够实现关联有安全策略函数的第一语句的语句块的执行计划的重用,减少语句块解析过程中所需的重复语义解析和生成执行计划所花费的时间,提高数据库的响应速度。实施例三本发明实施例三提供一种语句块执行计划的生成装置。该装置可以由软件和/或硬件实现,一般可集成在计算机设备的,典型的,可以集成在承载有数据库的计算机设备中,可通过执行语句块执行计划的生成方法生成语句块的执行计划。图4为本发明实施例三提供的语句块执行计划的生成装置的结构框图,如图4所示,该装置包括语句块获取模块301、语句改写模块302和计划生成模块303,其中,语句块获取模块301,用于获取当前语句块;语句改写模块302,用于将所述当前语句块中关联有安全策略函数的第一语句改写为第二语句,其中,所述第一语句为插入语句、更新语句、删除语句和查询语句,所述第二语句为动态执行语句;计划生成模块303,用于基于所述第一语句改写后得到的目标语句块生成所述当前语句块的目标执行计划。本发明实施例三提供的语句块执行计划的生成装置,通过语句块获取模块获取当前语句块,通过语句改写模块将当前语句块中关联有安全策略函数的插入语句、更新语句、删除语句和查询语句改写为动态执行语句,并通过计划生成模块根据改写后得到的目标语句块生成当前语句块的目标执行计划。本实施例通过采用上述技术方案,由于生成的目标执行计划中并不包含访问关联有安全策略函数的数据库对象的执行计划,因此,能够使得所生成的目标执行计划在第一语句关联任意安全策略函数以及在任意执行环境中都能够返回正确的执行结果,实现包含关联安全策略函数的第一语句的语句块的目标执行计划重用。在上述方案中,所述语句改写模块302可具体用于:将所述当前语句块的引用安全策略函数标识置为false,并按照执行顺序将所述当前语句块中的第一条sql语句确定为当前sql语句;解析所述当前sql语句,并判断所述当前sql语句是否为第一语句,若是,则将所述当前语句块的引用安全策略函数标识置为ture,并继续解析所述当前sql语句,直至所述当前sql语句解析完成;若否,则继续解析所述当前sql语句,直至所述当前sql语句解析完成;判断所述当前语句块的引用安全策略函数标识是否为ture,若是,则将所述当前sql语句改写为动态执行语句,将所述当前语句块的引用安全策略函数标识重置为false,将所述当前语句块中的下一条sql语句确定为当前sql语句,并返回执行解析所述当前sql语句的操作,直至不存在下一条sql语句为止;若否,则将所述当前语句块中的下一条sql语句确定为当前sql语句,并返回执行解析所述当前sql语句的操作,直至不存在下一条sql语句为止。进一步地,所述语句块执行计划的生成装置还可以包括:语句块执行模块,用于在所述基于所述第一语句改写后得到的目标语句块生成所述当前语句块的目标执行计划之后,依据所述目标执行计划执行所述当前语句块。进一步地,所述语句块执行计划的生成装置还可以包括:计划存储模块,用于在所述基于所述第一语句改写后得到的目标语句块生成所述当前语句块的目标执行计划之后,将所述当前语句块与所述目标执行计划对应存储于承载有所述当前数据库的计算机设备中。进一步地,所述语句块执行计划的生成装置还可以包括:语句块确定模块,用于在所述将所述当前语句块中关联有安全策略函数的第一语句改写为第二语句之前,确定承载有所述当前数据库的计算机设备中未存储与所述当前语句块相同的历史语句块。进一步地,所述语句块执行计划的生成装置还可以包括:计划获取模块,用于在承载有所述当前数据库的计算机设备中存储有与所述当前语句块相同的历史语句块时,获取所述历史语句块的执行计划,作为所述当前语句块的目标执行计划。本发明实施例三提供的语句块执行计划的生成装置可执行本发明任意实施例提供的语句块执行计划的生成方法,具备执行语句块执行计划的生成方法相应的功能模块和有益效果。未在本实施例中详尽描述的技术细节,可参见本发明任意实施例所提供的语句块执行计划的生成方法。实施例四图5为本发明实施例四提供的一种计算机设备的结构示意图,如图5所示,该计算机设备包括处理器50和存储器51,还可以包括输入装置52和输出装置53;计算机设备中处理器50的数量可以是一个或多个,图5中以一个处理器50为例;计算机设备中的处理器50、存储器51、输入装置52和输出装置53可以通过总线或其他方式连接,图5中以通过总线连接为例。存储器51作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的语句块执行计划的生成方法对应的程序指令/模块(例如,语句块执行计划的生成装置中的语句块获取模块301、语句改写模块302和计划生成模块303)。处理器50通过运行存储在存储器51中的软件程序、指令以及模块,从而执行计算机设备的各种功能应用以及数据处理,即实现上述的语句块执行计划的生成方法。存储器51可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器51可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器51可进一步包括相对于处理器50远程设置的存储器,这些远程存储器可以通过网络连接至计算机设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。输入装置52可用于接收输入的数字或字符信息,以及产生与计算机设备的用户设置以及功能控制有关的键信号输入。输出装置53可包括显示屏等显示设备。本发明实施例四还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种语句块执行计划的生成方法,该方法包括:获取当前语句块;将所述当前语句块中关联有安全策略函数的第一语句改写为第二语句,其中,所述第一语句为插入语句、更新语句、删除语句或查询语句,所述第二语句为动态执行语句;基于所述第一语句改写后得到的目标语句块生成所述当前语句块的目标执行计划。当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的语句块执行计划的生成方法中的相关操作。通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、闪存(flash)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。值得注意的是,上述语句块执行计划的生成装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1