首页> 中国专利> 变更语句逆向分析方法、数据库变更回退方法及系统

变更语句逆向分析方法、数据库变更回退方法及系统

摘要

一种变更语句逆向分析方法、数据库变更回退方法及系统,逆向分析方法包括:S1、确定变更语句涉及的对象、变更指令和对应于变更指令的回退指令;S2、如果变更语句进行创建/增加操作,则直接根据对象和回退指令确定回退语句;如果变更语句进行更改/删除操作,则确定被更改/删除的源数据/源内容,并根据对象、源数据/源内容和回退指令确定回退语句。回退方法包括:S10、获得SQL变更脚本输入、数据库版本和数据库授权;S20、对SQL变更脚本执行解析,生成语句解析结果;S30、基于语句解析结果,根据变更语句逆向分析方法生成回退语句并将回退语句转换为可执行的回退SQL脚本文件。该回退方法具有适用性广、可操作性强、安全、高效自动化的优点。

著录项

  • 公开/公告号CN103678532A

    专利类型发明专利

  • 公开/公告日2014-03-26

    原文格式PDF

  • 申请/专利权人 中国移动(深圳)有限公司;

    申请/专利号CN201310634777.9

  • 申请日2013-12-02

  • 分类号G06F17/30(20060101);

  • 代理机构44217 深圳市顺天达专利商标代理有限公司;

  • 代理人郭伟刚

  • 地址 518048 广东省深圳市滨河大道9023号国通大厦14楼

  • 入库时间 2023-12-17 01:00:24

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-04-24

    专利权人的姓名或者名称、地址的变更 IPC(主分类):G06F17/30 变更前: 变更后: 申请日:20131202

    专利权人的姓名或者名称、地址的变更

  • 2017-05-10

    授权

    授权

  • 2014-04-23

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20131202

    实质审查的生效

  • 2014-03-26

    公开

    公开

说明书

技术领域

本发明涉及软件系统运维领域,尤其涉及一种变更语句逆向分析方法、数据库变更回退方法及系统。 

背景技术

在软件生产系统运营过程中,随着业务的发展变化,常需要对软件系统进行功能改造或升级,改造和升级都会对软件系统本身带来变更。同时,在系统运行过程中,常会暴露出前期遗留的系统缺陷,对缺陷的修复也会导致系统变更。 

在多数软件生产系统中,数据库系统是一个重要的组成部分。常见的数据库系统如Oracle、MySQL、Sybase、MS SQL server等,在各行各业的软件系统中得到了广泛的应用。因此,对软件系统的变更,多数情况下也会涉及数据库系统的变更。 

系统部件根据存储形态,通常可分为文件和数据库。文件包含程序文件和配置文件,程序文件可能是二进制文件,也可能是文本格式的脚本文件,配置文件通常是ini、xml等格式的文本文件。文件的变更,一般是通过用新版本文件替换旧版本文件完成的。数据库的变更,通常包含数据定义变更、数据变更和权限变更。在进行数据库变更时,是通过执行相应的DDL(Data Definition Language,数据定义语言)、DML(Data Manipulation Language,数据操纵语言)、DCL(Data Control Language,数据控制语言)语句完成的。 

系统变更是必然的,但是因为一些原因,变更后的系统可能不会符合用户预期。常用的原因可能有,系统功能与用户需求不一致,变更引入了新的故障、变更无法完整实施。为了保证系统的正确性和可用性,某些情况下,需要对已完成的变更或未完成的变更实施回退,使系统恢复到变更前的状态。 

同理,变更回退也包含文件回退和数据库回退。对文件的回退是通过将备份的旧版本文件覆盖新版本文件完成的。而对数据库的回退,通常有手工回退和整库备份恢复回退两种方式。 

手工回退指的是对每条变更语句进行逆向分析,然后执行对应的回退语句来达到数据库变更回退的目的。针对DDL和DCL语句,大部分数据库并无回退机制,只能手工完成回退;针对DML语句,因为变更执行后数据均已提交,一种方法是利用数据库机制如Oracle闪回机制实现回退,此方法有几个明显的局限性,一是适用条件苛刻,如Oracle闪回机制本身具有多种约束条件限制,且其它多数数据库并无类似的机制,二是可操作性不高,类似操作通常需要专门的数据库维护人员,三是类似回退方法会影响变更后到回退前这段时间内的其他数据变更,除非是变更完成后立即回退,所以通常还是利用手工方式完成DML回退。 

数据库手工回退方法,在数据库变更较小的情况下,是可以胜任回退任务的,但是又具备难以克服的缺陷。首先是人工成本高,因为需要人工核查每条数据库变更语句,然后编写对应的逆向语句,在变更比较大或比较频繁的情况下,需要花费大量的人力;其次是正确性无法保障,因为是通过人工来完成逆向,缺乏有效的核对机制来确保工作的正确性,变更较大的情况下极易出错;再次,手工回退需要确保变更涉及的表结构、数据和权限在变更前得到备份,否则无法进行回退;最后,操作效率低,针对大型的变更,人工操作效率不高, 导致回退时间较长,因此会影响系统的可用性,导致其他一些间接的损失。 

除了手工回退外,还可以通过整库备份恢复的方式进行变更回退,即在变更实施前对整个数据库进行备份,变更完成后如果需要回退,则使用变更前的数据库备份进行恢复。 

至于整库备份恢复回退方法,优点是能够完全恢复数据库,但也存在明显的缺陷。一是成本巨大,进行整库备份恢复通常需要停库,这对于某些系统是不可接受的,且如果变更较小,进行整库备份恢复会导致较多的资源和时间消耗;二是专业性强,整库备份恢复需要专门的数据库DBA来完成。 

因此,目前对数据库变更的回退无论手工回退还是整库回退,都存在明显的缺陷。所以长远看来,需要有一种方案,能够解决手工回退和整库回退的缺陷,完成对数据库变更的自动化回退。 

发明内容

本发明要解决的技术问题在于,针对现有技术的上述手工回退存在的效率低、成本高、正确性无法保障的缺陷以及整库备存在的成本大、适用范围太窄的缺陷,提供一种适用性广、可操作性强、安全、高效自动化的变更语句逆向分析方法、数据库变更回退方法及系统。 

本发明解决其技术问题所采用的技术方案是:构造一种变更语句逆向分析方法,用于数据库中在所述变更语句执行之前进行逆向分析生成回退语句,所述变更语句为SQL语句,所述方法包括以下步骤: 

S1、确定所述变更语句涉及的对象、变更指令和对应于所述变更指令的回退指令; 

S2、如果所述变更语句进行创建/增加操作,则直接根据所述对象和回退 指令确定回退语句; 

如果所述变更语句进行更改/删除操作,则确定被更改/删除的源数据/源内容,并根据所述对象、源数据/源内容和回退指令确定回退语句。 

本发明所述的变更语句逆向分析方法,其中,所述对象包括直接对象和与所述直接对象相关联的关联对象; 

所述步骤S1中,确定所述变更语句涉及的对象包括:根据所述变更语句直接获取所述直接对象;和根据所述变更语句通过查询数据字典间接获取所述关联对象;所述查询数据字典是通过查询语句查询数据库系统; 

所述步骤S2中,确定被更改/删除的源数据/源内容包括:根据所述变更语句直接获取所述源数据/源内容;和根据所述变更语句通过查询数据表间接获取所述源数据/源内容;所述查询数据表是通过查询语句查询数据库系统和数据表。 

本发明所述的变更语句逆向分析方法,其中,所述变更语句包括DDL语句、DML语句和DCL语句; 

若变更语句为DDL语句,所述方法包括:创建对象的回退、更新对象的回退和删除对象的回退; 

若变更语句为DML语句,所述方法包括:新增数据的回退,更新数据的回退,删除数据的回退; 

若变更语句为DCL语句,所述方法包括:授权语句的回退、权限回收语句的回退。 

本发明所述的变更语句逆向分析方法,其中,如果变更语句为CREATEMM_name;其中M代表创建对象的类型,M_name代表创建对象的名称,所述创建对象的回退包括: 

S1a1、确定所述变更语句涉及的对象为M_name,变更指令为CREATE,CREATE对应的回退指令为DROP; 

S2a1、所述变更语句仅进行创建操作,直接确定所述回退语句为:DROP M M_name; 

如果变更语句为ALTER M M_name UD1,其中M代表更新对象的类型,M_name代表更新对象的名称,UD1代表更新内容的操作,UD1中涉及到的变更指令包括:ADD、DROP和MODIFY,所述更新对象的回退包括: 

S1a2、确定所述变更语句涉及的对象为M_name,变更指令包括:CREATE和UD1中涉及到的变更指令,CREATE对应的回退指令为DROP,ADD、DROP和MODIFY对应的回退指令分别为DROP、ADD和MODIFY; 

S2a2、所述变更语句进行更改操作,确定对应于UD1的被更改的源内容,确定所述回退语句为:ALTER M M_name UD2,UD2代表由对应于UD1的回退指令和源内容构成的实现回退的操作; 

如果变更语句为DROP M M_name;其中M代表删除对象的类型,M_name代表删除对象的名称,所述删除对象的回退包括: 

S1a3、确定所述变更语句涉及的对象为M_name,变更指令为DROP,DROP对应的回退指令为CREATE; 

S2a3、所述变更语句进行删除操作,确定被删除的源内容,确定所述回退语句为:CREATE M M_name UD3,UD3代表由源内容构成的限定条件; 

如果变更语句为INSERT INTO tb_a VALUES v_a,其中,tb_a代表新增数据的对象,v_a代表新增数据,所述新增数据的回退包括: 

S1b1、确定所述变更语句涉及的对象为tb_a,变更指令为:INSERT,对应的回退指令为DELETE; 

S2b1、所述变更语句进行更改操作,直接确定所述回退语句为:DELETE FROM M_name WHERE v_b,其中,v_b代表对应于新增数据v_a对应的字段; 

如果变更语句为UPDATE tb_a SET c,其中,tb_a代表更新数据的对象,c代表更新数据的操作,所述更新数据的回退包括: 

S1b2、确定所述变更语句涉及的对象为tb_a,变更指令为UPDATE,UPDATE对应的回退指令为UPDATE; 

S2b2、所述变更语句进行更改操作,确定对应于c的源数据,确定所述回退语句为:UPDATE tb_a SET d WHERE e,其中,d代表源数据的具体数据,e代表源数据对应的字段; 

如果变更语句为DELETE FROM tb_a WHERE c,其中,tb_a代表删除数据的对象,c代表删除数据对应的字段,所述删除数据的回退包括: 

S1b3、确定所述变更语句涉及的对象为tb_a,变更指令为:DELETE,DELETE对应的回退指令为INSERT; 

S2b3、所述变更语句进行删除操作,确定对应于c的源数据,确定所述回退语句为:INSERT INTO tb_a(col_a)VALUES d,其中,d代表源数据的具体数据,col_a代表源数据对应的字段; 

如果变更语句为GRANT A USER TO user_a,所述授权语句的回退包括: 

S1c1、确定所述变更语句涉及的对象为user_a,变更指令为:GRANT,对应的回退指令为REVOKE; 

S2c1、所述变更语句进行授权操作,直接确定所述回退语句为:REVOKE A FROM user_a; 

如果变更语句为REVOKE A ON tb_a FROM role_a;所述权限回收语句的回退包括: 

S1c1、确定所述变更语句涉及的对象为role_a,变更指令为:REVOKE,对应的回退指令为GRANT; 

S2c1、所述变更语句进行权限回收操作,直接确定所述回退语句为:GRANT A ON tb_a TO role_a。 

本发明还公开了一种基于所述的变更语句逆向分析方法的数据库变更回退方法,所述方法包括以下步骤: 

S10、获得SQL变更脚本输入、数据库版本和数据库授权; 

S20、对所述SQL变更脚本执行解析,生成语句解析结果; 

S30、基于所述语句解析结果,根据所述变更语句逆向分析方法生成回退语句并将所述回退语句转换为可执行的回退SQL脚本文件。 

本发明所述的数据库变更回退方法,其中,所述方法还包括: 

S40、输入回退执行命令,运行所述回退SQL脚本文件实现数据库变更回退。 

本发明所述的数据库变更回退方法,其中,所述步骤S10中,所述SQL变更脚本为包含所述变更语句的文本文件,所述数据库授权包括数据库用户名和密码; 

所述步骤S20中执行解析为根据所述SQL变更脚本调用所述数据库版本的SQL引擎执行Flex词法分析和Bison语法分析。 

本发明所述的数据库变更回退方法,其中,所述步骤S30中根据所述变更语句逆向分析方法生成的回退语句为由若干子句构成的逻辑回退语句,所述步骤S30将所述回退语句转换为可执行的回退SQL脚本文件具体包括: 

S31、重组:对所述子句进行重新组织; 

S32、填充:将重组后的所述子句填充后形成完整且合法的SQL语句; 

S33、映射:将步骤S32中得到的具有不同实现的SQL语句映射为特定数据库系统的语句; 

S34、合并:将数据导入命令和步骤S33中得到的语句合并为所述回退SQL脚本文件。 

本发明还提供一种基于所述的数据库变更回退方法的数据库变更回退系统,所述系统包括: 

用户接口层:用于与用户进行交互处理;所述交互处理包括获得SQL变更脚本输入、数据库版本、数据库授权以及回退执行命令; 

回退处理层:用于对所述SQL变更脚本执行解析,生成语句解析结果,并基于所述语句解析结果根据所述变更语句逆向分析方法生成回退语句,并将所述回退语句转换为可执行的回退SQL脚本文件; 

数据服务层:用于从数据库查询数据、进行源数据/源内容备份,以及在接收到所述回退执行命令时执行所述回退SQL脚本文件; 

数据库层:提供数据库系统。 

本发明所述的数据库变更回退系统,其中, 

所述用户接口层的功能组件包括: 

命令处理组件:用于接收所述SQL变更脚本和回退执行命令; 

信息交互组件:用于将所述数据库回退的过程与结果展示给用户; 

所述回退处理层的功能组件包括: 

SQL引擎:根据数据库的词法和语法规则,完成SQL变更脚本的解析并生成语句解析结果,SQL变更脚本的解析包括词法分析和语法分析,所述词法分析采用Flex工具,所述语法分析采用Bison工具; 

脚本解析组件:用于根据数据库类型调用对应的所述SQL引擎完成SQL 变更脚本的解析; 

逆向分析组件:用于分析所述语句解析结果,根据所述变更语句逆向分析方法生成回退语句; 

回退语句生成组件:用于结合所述数据服务层,将回退语句转换为和数据库类型相关的SQL回退语句,并将生成的回退SQL脚本文件提供给数据服务层; 

所述数据服务层包括: 

数据查询组件:用于从数据库获得所述SQL回退语句并生成需要的数据; 

数据备份组件:用于对回退需要备份的源数据/源内容进行备份和管理; 

脚本执行组件:用于获取所述回退SQL脚本文件,完成回退SQL脚本文件的执行; 

所述数据库层包括:Oracle、MySQL、Sybase、SQL Server系统。 

实施本发明的变更语句逆向分析方法、数据库变更回退方法及系统,具有以下有益效果:本发明的变更语句逆向分析方法在所述变更语句执行之前进行逆向分析生成回退语句,回退语句仅仅对变更语句涉及的对象或者对象的源数据/源内容进行回退,针对性强,工作量小。数据库变更回退方法利用该方法生成的回退语句,转换为可执行的回退SQL脚本文件,在需要进行数据库的回退时,执行回退SQL脚本文件即可,达到了适用性广、可操作性强、安全、高效自动化的优点。 

附图说明

下面将结合附图及实施例对本发明作进一步说明,附图中: 

图1是本发明变更语句逆向分析方法的流程图; 

图2A是本发明数据库变更回退方法的第一实施例的流程图; 

图2B是本发明数据库变更回退方法的第二实施例的流程图; 

图3是本发明数据库变更回退方法中INSERT语句语法解析的最终语法树; 

图4是本发明数据库变更回退系统的架构层次图; 

图5是本发明数据库变更回退系统的系统组件图。 

具体实施方式

为了对本发明的技术特征、目的和效果有更加清楚的理解,现对照附图详细说明本发明的具体实施方式。 

参考图1是本发明变更语句逆向分析方法的流程图; 

本发明的变更语句逆向分析方法,用于数据库中在变更语句执行之前进行逆向分析生成回退语句,所述变更语句为SQL语句,方法包括以下步骤: 

S1、确定变更语句涉及的对象、变更指令和对应于变更指令的回退指令; 

其中,对象包括直接对象和与直接对象相关联的关联对象,确定变更语句涉及的对象包括:根据变更语句直接获取直接对象;和根据变更语句通过查询数据字典间接获取关联对象; 

S2、如果变更语句进行创建/增加操作,则直接根据对象和回退指令确定回退语句;如果变更语句进行更改/删除操作,则确定被更改/删除的源数据/源内容,并根据对象、源数据/源内容和回退指令确定回退语句; 

确定被更改/删除的源数据/源内容包括:根据变更语句直接获取源数据/源内容;和根据变更语句通过查询数据表间接获取源数据/源内容。其中,源内容包括对象的详细属性以及与对象相关的数据和状态; 

查询数据字典是指通过查询语句查询数据库系统,查询数据表是指通过查询语句查询数据库系统和数据表。 

本发明主要针对三类变更语句:DDL语句、DML语句和DCL语句: 

DDL是数据定义语言,主要用于定义、更新、删除数据库对象,通常的数据库对象包含表、视图、索引、约束、存储过程、触发器、角色、用户等;DML是数据操纵语言,用于操作数据库中的数据。通常是对数据的查询、插入、更新、删除;DCL是数据控制语言,用于系统角色控制和授权,通常是对用户和角色权限的授权和取消授权。 

若变更语句为DDL语句,方法包括:创建对象的回退、更新对象的回退和删除对象的回退; 

若变更语句为DML语句,方法包括:新增数据的回退,更新数据的回退,删除数据的回退,MERGE类数据变更语句的回退,具有复杂变更条件的数据变更语句的回退,可包含重复行的表数据变更的回退; 

若变更语句为DCL语句,方法包括:授权语句的回退、权限回收语句的回退。下面结合具体的例子介绍以上三类变更语句的逆向分析方法。 

(a1)创建对象的回退 

变更语句创建了数据库对象,在变更前,数据库并不存在这个对象,回退比较简单,删除创建的数据库对象即可: 

如果变更语句为CREATE M M_name;其中M代表创建对象的类型,M_name代表创建对象的名称,创建对象的回退包括: 

S1a1、确定变更语句涉及的对象为M_name,变更指令为CREATE,CREATE对应的回退指令为DROP; 

S2a1、变更语句仅进行创建操作,直接确定回退语句为:DROP M M_name; 

例如: 

a1-1)变更语句:CREATE TABLE tb_a; 

分析:涉及的对象为直接对象tb_a,变更指令为CREATE,则回退指令为DROP。 

对应的回退语句:DROP TABLE tb_a; 

a1-2)变更语句:CREATE INDEX idx_a; 

分析:涉及的对象为直接对象idx_a,变更指令为CREATE,则回退指令为DROP。 

对应的回退语句:DROP INDEX idx_a; 

(a2)更新对象的回退 

更新对象的回退对更新的对象进行了更改,所以需要备份被更改的源内容:例如更前数据库对象的详细属性。因为对象更新可能会涉及到与该对象相关的关联对象的变化,例如数据约束条件的变化,因为数据约束,可能导致回退不成功,在这种情况下,源内容还包括与对象相关的原来的数据。在备份源内容的数据时,如果涉及到某些行或者列,则可只备份具体的行和列,否则可能需要全表备份。 

如果变更语句为ALTER M M_name UD1,其中M代表更新对象的类型,M_name代表更新对象的名称,UD1代表更新内容的操作,UD1中涉及到的变更指令包括:ADD、DROP和MODIFY,更新对象的回退包括: 

S1a2、确定变更语句涉及的对象为M_name,变更指令包括:CREATE和UD1中涉及到的变更指令,CREATE对应的回退指令为DROP,ADD、DROP和MODIFY对应的回退指令分别为DROP、ADD和MODIFY; 

S2a2、变更语句进行更改操作,确定对应于UD1的被更改的源内容,确定 回退语句为:ALTER M M_name UD2,UD2代表由对应于UD1的回退指令和源内容构成的实现回退的操作; 

例如: 

a2-1)变更语句:ALTER TABLE tb_a ADD col_a INTEGER NOT NULL; 

分析:涉及的对象为直接对象tb_a,变更指令为ALTER和ADD,则回退指令为ALTER和DROP,之前不存在col_a,因此,回退时需要删除该列。 

对应的回退语句:ALTER TABLE tb_a DROP COLUMN col_a; 

a2-2)变更语句:ALTER TABLE tb_a MODIFY col_a VARCHAR2(32)DEFAULT‘TEST’NOT NULL; 

分析:涉及的对象为tb_a,变更指令为ALTER和MODIFY,则回退指令为ALTER和MODIFY,被更改的源内容为col_a列的属性:数据类型、缺省值和字段是否非空。变更将数据表tb_a的列col_a类型修改为VARCHAR232,缺省值为字符串‘TEST’,字段非空,在变更语句中并不知道变更前列col_a的数据类型,因此需要先获得变更前列col_a的数据类型,通过如下查询语句查询数据表: 

SELECT data_type,data_length,nullable,nvl2(data_default,’N’,’Y’)default_exist FROM user_tab_columns WHERE table_name=UPPER('tb_a')and column_name=upper('col_a'); 

假设如上语句获取到的结果为:VARCHAR2,16,‘N’,’Y’,则表示列col_a原来的数据类型为VARCHAR2,长度为16,是非空字段,且存在缺省值,那么还需要获取其原来的缺省值,可通过如下语句获取: 

假设如上语句输出结果为:‘ABC’,表示该字段原来缺省值为字符串‘ABC’。 

此处还需注意,因为此变更语句修改了字段长度,因此在变更后插入的列值可能会使用新的长度,而在数据库回退过程中,通常不能从较长的长度回退到较短的长度,所以此处的源内容还包括原来的字段值。假设此处通过SQL形式备份到SQL文件import_data_tb_a.sql。 

对应的回退语句: 

UPDATE tb_a SET col_a=‘’; 

ALTER TABLE tb_a MODIFY col_a VARCHAR2(16)DEFAULT‘ABC’NOT NULL; 

再执行import_data_tb_a.sql导入数据。 

(a3)删除对象的回退 

对于不涉及数据和状态的对象,如索引,视图、用户、角色、存储过程、触发器、函数等,源内容即为这些数据库对象的详细属性。对于和数据或状态相关的数据库对象,如表、字段、序列等,源内容不但包括对象属性,还包括与对象相关的数据或对象的状态。如变更语句删除了一个数据表,那么在回退 时,不但需要获得原来的表结构,还需要获得原来的表数据;如变更语句删除了一个序列,那么在回退时,不但要获得序列的初始、步长、最大值等属性,还要获得序列的状态即当前值。 

删除表可能会对与该表相关联的关联对象产生影响,如删除表对象将会同时删除掉表上的索引、主键、约束、触发器,与该数据表相关的存储过程会失效。因此源内容还包括:关联对象的属性,以便回退时重建和重新生效。 

如果变更语句为DROP M M_name;其中M代表删除对象的类型,M_name代表删除对象的名称,删除对象的回退包括: 

S1a3、确定变更语句涉及的对象为M_name,变更指令为DROP,DROP对应的回退指令为CREATE; 

S2a3、变更语句进行删除操作,确定被删除的源内容,确定回退语句为:CREATE M M_name UD3,UD3代表由源内容构成的限定条件; 

例如: 

a3-1)变更语句:DROP INDEX idx_a; 

分析:涉及的对象为直接对象idx_a,变更指令为DROP,则回退指令为CREATE,变更语句删除了索引idx_a,回退时首先需要获得索引的特征,因此源内容包括:表名、用户名、是否唯一索引,可通过如下查询语句获得: 

SELECT index_name,uniqueness,table_name,table_owner FROM user_indexes WHERE index_name='idx_a'; 

假设如上语句查询结果为:’idx_a’,’UNIQUE’,’tb_a’,’user_a’,则表示索引idx_a为唯一索引,建立在表tb_a上,所属用户为user_a。 

源内容还包含其索引的列及顺序,可通过如下查询语句获得: 

SELECT column_name,descend FROM user_ind_columns WHERE index_name ='idx_a'order by column_position; 

假设如上语句查询结果为: 

col_a,ASC 

col_b,DESC 

表明索引idx_a包含两列,第一列为col_a,升序,第二列为col_b,降序。 

对应的回退语句: 

CREATE UNIQUE INDEX idx_a ON tb_a(col_a ASC,col_b DESC); 

a3-2)变更语句:DROP TABLE tb_a; 

分析:涉及的对象为直接对象tb_a以及与该表关联的关联对象:主键、索引、外键、约束、触发器等,变更指令为DROP,则回退指令为CREATE,源内容包括表的所有行和列以及表里的数据以及所有对象的详细属性,因此如果要回退,需要重建所有对象,并重新导入数据。 

首先获得表所有列及其属性,以便查询数据及重建表,可通过如下语句: 

SELECTt.column_name,t.data_type,t.data_length,t.data_precision,t.data_scale,t.nullable,t.data_default,c.comments 

FROM user_tab_columns t,user_col_comments c WHERE t.table_name=c.table_name AND t.column_name=c.column_name AND t.table_name='TB_A'; 

根据列名导出数据,对tb_a表来说,执行如下语句备份数据到import_data_tb_a.sql文件里: 

SELECT col_a,col_b,col_c FROM tb_a; 

查询表的主键及构成列,以便重建主键,通过如下语句: 

SELECT t.constraint_name,c.column_name,c.position FROM user_constraints t,user_cons_columns c WHERE t.constraint_name=c.constraint_name AND t.constraint_type='P'AND t.table_name='TB_A'; 

查询表的索引及构成列,以便重建索引,通过如下语句: 

SELECT i.index_name,c.column_name,c.column_position,c.descend FROM user_indexes i,user_ind_columns c WHERE i.index_name=c.index_name AND i.table_name='TB_A'; 

查询表的唯一性约束和外键及构成列,以便重建约束和外键,通过如下语句: 

SELECT t.constraint_name,c.column_name,c.position FROM user_constraints t,user_cons_columns c WHERE t.constraint_name=c.constraint_name AND t.constraint_type IN('U','R')AND t.table_name='TB_A'; 

查询表的触发器及代码,以便重建触发器,通过如下语句: 

SELECT t.trigger_name,t.trigger_type,s.line,s.text FROM user_triggers t,user_source s WHERE t.trigger_name=s.name AND t.table_name='TB_A'; 

对应的回退语句:通过上述分析结果,重新构建创建表语句,创建主键、索引、外键、约束、触发器语句,创建成功后,导入备份的数据,具体的创建语句为本领域公知技术,此处不再赘述。 

(b1)新增数据的回退 

如果变更语句为INSERT INTO tb_a VALUES v_a,其中,tb_a代表新增 数据的对象,v_a代表新增数据,新增数据的回退包括: 

S1b1、确定变更语句涉及的对象为tb_a,变更指令为:INSERT,对应的回退指令为DELETE; 

S2b1、变更语句进行更改操作,直接确定回退语句为:DELETE FROM M_name WHERE v_b,其中,v_b代表对应于新增数据v_a对应的字段; 

例如: 

b1-1)变更语句:INSERT INTO tb_a(col_a,col_b)VALUES(1,’v_a’); 

分析:涉及的对象为直接对象tb_a,变更指令为INSERT,则回退指令为DELETE,新增数据(1,’v_a’)对应的字段为:col_a=1AND col_b=‘v-a’。 

对应的回退语句:DELETE FROM tb_a WHERE col_a=1AND col_b=‘v-a’; 

b1-2)变更语句:INSERT INTO tb_a VALUES(1,’v_a’,v_b’); 

分析:涉及的对象为直接对象tb_a,变更指令为INSERT,则回退指令为DELETE,为了确定新增数据对应的字段,需要获取表的所有列名,可通过如下查询语句获取: 

SELECT column_name FROM user_tab_columns WHERE table_name='tb_a'ORDER BY column_id; 

假设如上语句查询结果为: 

col_a 

col_b 

col_c 

则表明数据表tb_a的列按顺序分别为col_a,col_b,col_c。 

对应的回退语句:DELETE FROM tb_a WHERE col_a=1AND col_b=‘v_a’AND col_c=‘v_b’; 

(b2)更新数据的回退 

如果变更语句为UPDATE tb_a SET c,其中,tb_a代表更新数据的对象,c代表更新数据的操作,更新数据的回退包括: 

S1b2、确定变更语句涉及的对象为tb_a,变更指令为UPDATE,UPDATE对应的回退指令为UPDATE; 

S2b2、变更语句进行更改操作,确定对应于c的源数据,确定回退语句为:UPDATE tb_a SET d WHERE e,其中,d代表源数据的具体数据,e代表源数据对应的字段; 

UPDATE语句更新了数据表的数据,要进行回退操作,首先需分析是否可以从变更语句推导出回退语句,如不能,则必须要备份更新前的数据。如下两个实例分别说明不可推导和可推导出回退语句的分析机制。 

例如: 

b2-1)变更语句:UPDATE tb_a SET col_c=10; 

分析:涉及的对象为tb_a,变更指令为UPDATE,则回退指令为UPDATE,变更语句更新了表tb_a所有行的字段col_c值为10,因此源数据为col_c中的数据。对于有主键的数据表,只需备份主键字段和变更字段的值;对于无主键的数据表,可通过备份系统行标识如Oracle ROWID和变更字段,或进行全表备份。查询表是否存在主键可通过如下语句完成: 

SELECT constraint_name FROM user_constraints WHERE table_name='tb_a'AND constraint_type='P'; 

假设如上语句查询结果为:SYS_C0000001,则表示数据表tb_a存在名为SYS_C0000001的主键,继续查询主键字段,通过如下语句: 

SELECT column_name FROM user_cons_columns WHERE constraint_name= 'SYS_C0000001'; 

假设如上语句查询结果为: 

col_a 

col_b 

表明数据表tb_a的主键字段为col_a,col_b,那么我们备份数据只需要备份col_a,col_b,col_c的值,通过如下语句查询数据表tb_a: 

SELECT col_a,col_b,col_c FROM tb_a; 

假设查询结果为: 

1,10,100 

2,20,200 

3,30,300 

对应的回退语句: 

UPDATE tb_a SET col_c=100WHERE col_a=1AND col_b=10; 

UPDATE tb_a SET col_c=200WHERE col_a=2AND col_b=20; 

UPDATE tb_a SET col_c=300WHERE col_a=3AND col_b=30; 

b2-2)变更语句:UPDATE tb_a SET col_b=col_b+100WHERE col_b=10; 

分析:涉及的对象为tb_a,变更指令为UPDATE,则回退指令为UPDATE,变更语句修改了数据表tb_a的字段col_b为原值增加100,且更新条件为字段col_b等于10,因此源数据的具体数据可以直接推导出,无需备份数据。 

对应的回退语句:UPDATE tb_a SET col_b=col_b-100WHERE col_b=10; 

(b3)删除数据的回退 

如果变更语句为DELETE FROM tb_a WHERE c,其中,tb_a代表删除数据的对象,c代表删除数据对应的字段,删除数据的回退包括: 

S1b3、确定变更语句涉及的对象为tb_a,变更指令为:DELETE,DELETE对应的回退指令为INSERT; 

S2b3、变更语句进行删除操作,确定对应于c的源数据,确定回退语句为:INSERT INTO tb_a(col_a)VALUES d,其中,d代表源数据的具体数据,col_a代表源数据对应的字段; 

例如: 

b3-1)变更语句: 

DELETE FROM tb_a WHERE col_a=1; 

分析:涉及的对象为tb_a,变更指令为DELETE,则回退指令为INSERT,变更语句删除了数据表tb_a所有col_a字段等于1的行,源数据包括所有col_a等于1的行中的数据,先通过如下语句查询表tb_a的列及顺序: 

SELECT column_name FROM user_tab_columns WHERE table_name='tb_a'ORDER BY column_id; 

假设如上语句查询结果为: 

col_a 

col_b 

col_c 

则表明数据表tb_a的字段按顺序分别为col_a,col_b,col_c。再查询变更前待删除行的数据,通过如下语句获取: 

SELECT col_a,col_b,col_c FROM tb_a WHERE col_a=1; 

假设如上语句查询结果为: 

1,10,‘A’ 

1,10,‘B’ 

1,20,‘C’ 

根据查询到的列名及数据,可得到最终的变更回退语句。 

对应的回退语句: 

INSERT INTO tb_a(col_a,col_b,col_c)VALUES(1,10,‘A’); 

INSERT INTO tb_a(col_a,col_b,col_c)VALUES(1,10,‘B’); 

INSERT INTO tb_a(col_a,col_b,col_c)VALUES(1,20,‘C’); 

(b4)MERGE类数据变更语句的回退 

MERGE语句从源表向目标表根据条件处理数据,操作可能是INSERT,也可能是UPDATE,因此备份源数据时,也需要根据条件判断如何备份,以及备份哪些数据。 

例如: 

b4-1)变更语句: 

分析:变更语句将源表tb_b的数据合并进目标表tb_a,如果tb_b表的字段col_a值等于tb_a的字段col_a值,则使用tb_b表的记录更新tb_a表的记录,否则,将源表tb_b中的记录插入到目标表tb_a中。 

进行变更回退时,需要先判断目标表tb_a中是否存在与源表tb_b中col_a字段值相同的记录,若存在,则表明这部分数据行被源表数据更新,因此需要备份这部分数据行以便恢复更新,可通过如下语句查询被更新数据行: 

SELECT a.col_a,a.col_b,a.col_c FROM tb_a a,tb_b b WHERE a.col_a=b.col_a; 

假设上述语句查询结果为: 

1,2,3 

1,2,4, 

1,3,4 

表明这些数据行被更新,为了回退源数据,还需要知道源数据被更新后的值,可通过如下语句获得被更新行更新后的值: 

SELECT col_a,col_b,col_c FROM tb_b b WHERE EXISTS(SELECT1FROM tb_a a WHERE a.col_a=b.col_a); 

假设查询结果为: 

1,5,9 

表明被更新行都被更新为1,5,9。根据变更前和变更后的数据,即可得到最终的回退语句。 

源数据除了更新行之外,还包括目标表中新增的行,在进行回退时,这部分新增行应该被删除。可通过如下语句查询新增行: 

SELECT col_a,col_b,col_c FROM tb_b b WHERE NOT EXISTS(SELECT 1 FROM tb_a a WHERE a.col_a=b.col_a); 

假设上述语句查询结果为: 

3,3,6 

回退语句: 

DELETE FROM tb_a WHERE col_a=1AND col_b=5AND col_c=9; 

INSERT INTO tb_a(col_a,col_b,col_c)VALUES(1,2,3); 

INSERT INTO tb_a(col_a,col_b,col_c)VALUES(1,2,4); 

INSERT INTO tb_a(col_a,col_b,col_c)VALUES(1,3,4); 

DELETE FROM tb_a WHERE col_a=3AND col_b=3AND col_c=6; 

(b5)具有复杂变更条件的数据变更语句的回退 

在所有的SQL语句中,DML语句可以表现为最复杂的形式。DML语句可以包含表连接、子查询、集合运算等多种操作,给执行DML回退时带来了较高的复杂度,但无论DML语句有多么复杂,需要回退的最终操作仍然不过INSERT、UPDATE、DELETE三种情况,其复杂主要体现在复杂的约束条件上。因此只要准确的分析DML语句结构,在备份源数据时加上约束条件,就能准确的得到回退语句。如下示例说明复杂DML语句的逆向分析机制。 

例如: 

b5-1)变更语句: 

分析:该语句比较复杂,包含了子查询、集合操作,但从语句体可以看出,其核心操作还是第一行INSERT语句,从第二行开始的SELECT语句到结尾,全部是待INSERT的数据查询语句,所以备份源数据时,只需要备份SELECT处理的数据,我们执行如下SELECT语句获得待备份的源数据: 

假设如上语句查询结果为: 

1,5,9 

2,6,3 

2,6,4 

对应的回退语句: 

DELETE FROM tb_a WHERE col_a=1AND col_b=5AND col_c=9; 

DELETE FROM tb_a WHERE col_a=2AND col_b=6AND col_c=3; 

DELETE FROM tb_a WHERE col_a=2AND col_b=6AND col_c=4; 

(b6)可包含重复行的表数据变更的回退 

可包含重复行的表,通常是表没有主键或唯一性约束,这样的数据表中可以存在多条数据完全一致的记录行,对这种表的回退需要考虑可能存在重复行的情况,会影响到INSERT和UPDATE语句的回退。 

就INSERT语句,如果插入了一行记录,而表中本来就有一行相同的记录, 那么简单的执行DELETE回退,就会把原来的记录行也删除。因此对于此种情况,我们需要先判断表是否有主键或唯一性约束,可通过如下语句查询: 

SELECT*FROM user_constraints WHERE constraint_type IN('P','U')AND table_name='tb_a'; 

如果上述查询无返回结果,则表明该表可能存在重复记录,那么此时源数据的备份为全表备份,而不能只备份INSERT的记录行,执行回退时先进行全表删除然后进行备份数据的全表插入。 

就UPDATE语句,针对可重复记录行的表,如果UPDATE语句将表中多行记录更新为完全相同的记录,那么在回退UPDATE时可能会出现数据不可恢复的情况。某些数据库具有固定的行标识如Oracle ROWID,则可通过备份系统行标识来确定回退行,如没有行标识字段,则源数据的备份需要进行全表备份。 

(c1)授权语句的回退 

如果变更语句为GRANT A USER TO user_a,授权语句的回退包括: 

S1c1、确定变更语句涉及的对象为user_a,变更指令为:GRANT,对应的回退指令为REVOKE; 

S2c1、变更语句进行授权操作,与权限相关的授权操作或者权限回收操作都相当于创建/增加操作,授权操作相当于增加或者创建一个权限,权限回收操作则相当于增加或者创建一个“负”权限,因此,这两种情况都不用确定源数据或者源内容,直接确定回退语句为:REVOKE A FROM user_a; 

例如: 

c1-1)变更语句:GRANT CREATE SESSION,CREATE USER TO user_a; 

对应的回退语句:REVOKE CREATE SESSION,CREATE USER FROM user_a; 

(c2)权限回收语句的回退 

如果变更语句为REVOKE A ON tb_a FROM role_a;权限回收语句的回退包括: 

S1c1、确定变更语句涉及的对象为role_a,变更指令为:REVOKE,对应的回退指令为GRANT; 

S2c1、变更语句进行权限回收操作,直接确定回退语句为:GRANT A ON tb_a TO role_a。 

例如: 

C2-1)变更语句:REVOKE SELECT,INSERT,UPDATE,DELETE ON tb_a FROM role_a; 

对应的回退语句:GRANT SELECT,INSERT,UPDATE,DELETE ON tb_a TO role_a; 

综上可见,如果手工执行回退分析,其复杂度和工作量会很大,本发明针对复杂的回退分析过程,建立了一套自动化、智能、准确的分析方法和系统,利用上述逆向分析方法,在获得变更脚本输入后,整个分析过程无需人工干预,便可生成最终的回退脚本。在执行回退时,简单的通过调用回退脚本即可自动完成数据库变更回退。 

参考图2A是本发明数据库变更回退方法的第一实施例的流程图;图2B是本发明数据库变更回退方法的第二实施例的流程图; 

本发明的数据库变更回退方法包括: 

S10、获得SQL变更脚本输入、数据库版本和数据库授权; 

SQL变更脚本的执行用户的数据库授权小于数据库权限,SQL变更脚本为包含变更语句的文本文件,数据库授权包括数据库用户名和密码; 

S20、对SQL变更脚本执行解析,生成语句解析结果;为根据所述SQL变 更脚本调用所述数据库版本的SQL引擎执行Flex词法分析和Bison语法分析。 

传统的语言解析方法,是首先按照规则,将文本中的字符串划分为一个个符号Token,Token主要有两种属性,Token名称Token Name,Token值Token Value,对整个文件的不断处理会连续的输出Token流,整个过程称之为词法分析。词法分析概括起来说,就是定义Token类型和划分规则,并执行分析获得Token流的过程。 

语法分析是根据定义的语法规则,获得输入的Token流,进行语法树构建,最终识别语句的过程。本发明的方案支持Oracle、MySQL、Sybase和SQL Server大部分常见语句,且可以通过扩展SQL引擎,支持新的数据库类型,扩展词法与语法规则,支持新的语句类型。 

下面以SQL语句中常见的INSERT语句为例,介绍SQL引擎的工作方法和流程。 

(a)词法分析 

假设要向数据表tb_a中插入一行数据(1,2,‘test’),存在如下两种写法,且都是合法的INSERT语句。 

INSERT INTO tb_a VALUES(1,2,'test'); 

INSERT INTO tb_a(col_a,col_b)VALUES(1,'test'); 

在上述语句中,可以发现如下规律: 

1、INSERT语句必须以INSERT INTO关键字开始; 

2、接下来必须跟上待插入数据的表名,此处假设表名只能是字母、数字、下划线的组合,且必须以字母开头; 

3、表名后可以包含列名,也可以不包含列名。不包含列名表示所有列,包含列名则必须以左括号开始,右括号结束,列名以逗号分隔。此处同样假设 列名只能是字母、数字、下划线的组合,且必须以字母开头; 

4、之后是VALUES子句; 

5、VALUES子句后,是具体的待插入值,以左括号开始,右括号结束,多个值以逗号分隔,如果值为字符串,以引号开始,引号结束。 

根据如上分析结果,可以总结如表1所示的INSERT语句的Token类型。 

表1 

Flex使用基于正则表达式的词法匹配规则,那么此处针对如上INSERT语句,定义的Flex词法文件如下: 

[Ii][Nn][Ss][Ee][Rr][Tt]    {return INSERT;} 

[Ii][Nn][Tt][Oo]                 {return INTO;} 

[Vv][Aa][Ll][Uu][Ee][Ss]    {return VALUES;} 

"("|")"|","|";"       {return yytext[0];} 

[A-Za-z][A-Za-z0-9_]*    {return NAME;} 

[0-9]+                {return NUMBER;} 

"'"[^"'"\n]*"'"         {return STRING;} 

[\t] 

.                         {yyerror("匹配失败");} 

根据如上词法文件,对上述第一条INSERT语句的词法分析结果如表2。 

表2 

(b)语法分析 

不同的语言有不同的语法,SQL语言也是如此。就SQL语言来说,虽然存在SQL国际标准,但是不同的数据库厂商对自身的数据库产品往往进行了一些增强和扩展,所以对不同的数据库类型,语法也具有一些差异。进行语法分析前,首先要确定语言的语法规则,然后才能根据规则分析输入语句。 

在Bison中,对语法规则的定义是主要是通过词法分析输出的Token来完成的。Token是语法规则的基本元素,在语法分析的范畴内,Token被称为终结符,通过终结符建立最终的有语义的语句。同样以上述INSERT语句为例, 

说明语法解析的方法和过程。 

首先,根据SQL语句格式定义如下INSERT语法规则: 

根据上述语法规则,对语句“INSERT INTO tb_a(col_a,col_b)VALUES(1,'test');”的语法解析过程如图3所示。方框内的叶子节点为终结符,终结符均是词法分析的输出,树上的椭圆形节点均为非终结符,树的结构则展示了语句的语法规则。不仅是INSERT语句,其他的任何SQL语句都可以通过定义语法规则来完成语义解析。 

S30、基于语句解析结果,根据变更语句逆向分析方法生成回退语句并将回退语句转换为可执行的回退SQL脚本文件。 

SQL语句通常是顺序执行的,具有语句级别的前后依赖关系,因此在对变更语句进行逆向分析时,需要从最后一条语句开始,逆序分析直到第一条语句。 

假设当前数据库环境为Oracle,数据表tb_a无主键和唯一性索引,表中存在与带插入数据重复的记录行。对上述INSERT语句的逆向分析过程如表3所示。 

表3 

上表Token名值两列标识输入的Token类型和值,回退逻辑输出列显示了逆向分析的结果。不光是INSERT语句,其他SQL语句同样适合类似的分析方法。 

上述步骤S10-S30仅仅是生成了回退SQL脚本文件,并未执行备份,在需要进行备份时,还进一步包括以下步骤: 

S40、输入回退执行命令,运行回退SQL脚本文件实现数据库变更回退。 

关于步骤S30中根据变更语句逆向分析方法生成的回退语句为由若干子句构成的逻辑回退语句,步骤S30将回退语句转换为可执行的回退SQL脚本文件具体包括: 

S31、重组:对子句进行重新组织; 

回退语句的结构通常与变更语句不同,因此需要对子句进行重新组织。 

S32、填充:将重组后的子句填充后形成完整且合法的SQL语句; 

不同的语句语法格式不尽相同,某些语法单元无法通过逆向分析得出,需要系统根据语句的语法和语义自动补充,如DELETE语句的FROM,条件子句的WHERE,多个条件语句之间的AND或OR逻辑关系等。填充后的语句才是完整合法的回退SQL语句。 

S33、映射:将步骤S32中得到的具有不同实现的SQL语句映射为特定数据库系统的语句; 

不同的数据库系统有不同的语法,同样的逻辑语句在不同的数据库系统里可能有不同的实现,系统需要将具有不同实现的语句映射为特定数据库系统的语句。如语句分隔符,在Oracle、MySQL数据库里为分号,在Sybase、SQLServer 数据库里为go; 

S34、合并:将数据导入命令和步骤S33中得到的语句合并为回退SQL脚本文件。 

如上四个步骤为实体回退时,回退SQL脚本文件生成的过程,某些过程可能是可选的,实际处理过程中,会根据语句的特征进行特定的处理。如表4示例展示了INSERT语句回退脚本文件生成的过程。 

表4 

本发明还公开了一种基于上述的数据库变更回退方法的数据库变更回退 系统,参考图4是本发明数据库变更回退系统的架构层次图,系统包括: 

用户接口层100:用于与用户进行交互处理;交互处理包括获得SQL变更脚本输入、数据库版本、数据库授权以及回退执行命令; 

回退处理层200:用于对SQL变更脚本执行解析,生成语句解析结果,并基于语句解析结果根据变更语句逆向分析方法生成回退语句,并将回退语句转换为可执行的回退SQL脚本文件; 

数据服务层300:用于从数据库查询数据、进行源数据/源内容备份,以及在接收到回退执行命令时执行回退SQL脚本文件; 

数据库层400:提供数据库系统。 

参考图5是本发明数据库变更回退系统的系统组件图。 

用户接口层100的功能组件包括: 

命令处理组件101:用于接收SQL变更脚本和回退执行命令; 

信息交互组件102:用于将数据库回退的过程与结果展示给用户; 

回退处理层200的功能组件包括: 

SQL引擎201:根据数据库的词法和语法规则,完成SQL变更脚本的解析并生成语句解析结果,SQL变更脚本的解析包括词法分析和语法分析,其中,词法解析采用Flex工具,语法解析采用Bison工具; 

脚本解析组件202:用于根据数据库类型调用对应的SQL引擎201完成SQL变更脚本的解析,并负责解析过程的错误处理; 

逆向分析组件203:用于分析语句解析结果,根据变更语句逆向分析方法生成回退语句; 

回退语句生成组件204:用于结合数据服务层300,将回退语句转换为和数据库类型相关的SQL回退语句,并将生成的回退SQL脚本文件提 供给数据服务层300; 

数据服务层300包括: 

数据查询组件301:用于从数据库获得SQL回退语句并生成需要的数据;数据备份组件302:用于对回退需要备份的源数据/源内容进行备份和管理; 

脚本执行组件303:用于获取回退SQL脚本文件,完成回退SQL脚本文件的执行; 

数据库层400包括:Oracle、MySQL、Sybase、SQL Server系统。 

综上所述,本发明的变更语句逆向分析方法在所述变更语句执行之前进行逆向分析生成回退语句,回退语句仅仅对变更语句涉及的对象或者对象的源数据/源内容进行回退,针对性强,工作量小。数据库变更回退方法利用该方法生成的回退语句,转换为可执行的回退SQL脚本文件,在需要进行数据库的回退时,执行回退SQL脚本文件即可,达到了适用性广、可操作性强、安全、高效自动化的优点。 

上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,这些均属于本发明的保护之内。 

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号