變更語句逆向分析方法、數(shù)據(jù)庫變更回退方法及系統(tǒng)的制作方法【專利摘要】一種變更語句逆向分析方法、數(shù)據(jù)庫變更回退方法及系統(tǒng),逆向分析方法包括:S1、確定變更語句涉及的對(duì)象、變更指令和對(duì)應(yīng)于變更指令的回退指令;S2、如果變更語句進(jìn)行創(chuàng)建/增加操作,則直接根據(jù)對(duì)象和回退指令確定回退語句;如果變更語句進(jìn)行更改/刪除操作,則確定被更改/刪除的源數(shù)據(jù)/源內(nèi)容,并根據(jù)對(duì)象、源數(shù)據(jù)/源內(nèi)容和回退指令確定回退語句?;赝朔椒òǎ篠10、獲得SQL變更腳本輸入、數(shù)據(jù)庫版本和數(shù)據(jù)庫授權(quán);S20、對(duì)SQL變更腳本執(zhí)行解析,生成語句解析結(jié)果;S30、基于語句解析結(jié)果,根據(jù)變更語句逆向分析方法生成回退語句并將回退語句轉(zhuǎn)換為可執(zhí)行的回退SQL腳本文件。該回退方法具有適用性廣、可操作性強(qiáng)、安全、高效自動(dòng)化的優(yōu)點(diǎn)。【專利說明】變更語句逆向分析方法、數(shù)據(jù)庫變更回退方法及系統(tǒng)【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及軟件系統(tǒng)運(yùn)維領(lǐng)域,尤其涉及一種變更語句逆向分析方法、數(shù)據(jù)庫變更回退方法及系統(tǒng)?!?br>背景技術(shù):
】[0002]在軟件生產(chǎn)系統(tǒng)運(yùn)營(yíng)過程中,隨著業(yè)務(wù)的發(fā)展變化,常需要對(duì)軟件系統(tǒng)進(jìn)行功能改造或升級(jí),改造和升級(jí)都會(huì)對(duì)軟件系統(tǒng)本身帶來變更。同時(shí),在系統(tǒng)運(yùn)行過程中,常會(huì)暴露出前期遺留的系統(tǒng)缺陷,對(duì)缺陷的修復(fù)也會(huì)導(dǎo)致系統(tǒng)變更。[0003]在多數(shù)軟件生產(chǎn)系統(tǒng)中,數(shù)據(jù)庫系統(tǒng)是一個(gè)重要的組成部分。常見的數(shù)據(jù)庫系統(tǒng)如Oracle、MySQL、Sybase、MSSQLserver等,在各行各業(yè)的軟件系統(tǒng)中得到了廣泛的應(yīng)用。因此,對(duì)軟件系統(tǒng)的變更,多數(shù)情況下也會(huì)涉及數(shù)據(jù)庫系統(tǒng)的變更。[0004]系統(tǒng)部件根據(jù)存儲(chǔ)形態(tài),通??煞譃槲募蛿?shù)據(jù)庫。文件包含程序文件和配置文件,程序文件可能是二進(jìn)制文件,也可能是文本格式的腳本文件,配置文件通常是in1、xml等格式的文本文件。文件的變更,一般是通過用新版本文件替換舊版本文件完成的。數(shù)據(jù)庫的變更,通常包含數(shù)據(jù)定義變更、數(shù)據(jù)變更和權(quán)限變更。在進(jìn)行數(shù)據(jù)庫變更時(shí),是通過執(zhí)行相應(yīng)的DDL(DataDefinitionLanguage,數(shù)據(jù)定義語言)、DML(DataManipulationLanguage,數(shù)據(jù)操縱語言)、DCL(DataControlLanguage,數(shù)據(jù)控制語言)語句完成的。[0005]系統(tǒng)變更是必然的,但是因?yàn)橐恍┰?,變更后的系統(tǒng)可能不會(huì)符合用戶預(yù)期。常用的原因可能有,系統(tǒng)功能與用戶需求不一致,變更引入了新的故障、變更無法完整實(shí)施。為了保證系統(tǒng)的正確性和可用性,某些情況下,需要對(duì)已完成的變更或未完成的變更實(shí)施回退,使系統(tǒng)恢復(fù)到變更前的狀態(tài)。[0006]同理,變更回退也包含文件回退和數(shù)據(jù)庫回退。對(duì)文件的回退是通過將備份的舊版本文件覆蓋新版本文件完成的。而對(duì)數(shù)據(jù)庫的回退,通常有手工回退和整庫備份恢復(fù)回退兩種方式。[0007]手工回退指的是對(duì)每條變更語句進(jìn)行逆向分析,然后執(zhí)行對(duì)應(yīng)的回退語句來達(dá)到數(shù)據(jù)庫變更回退的目的。針對(duì)DDL和DCL語句,大部分?jǐn)?shù)據(jù)庫并無回退機(jī)制,只能手工完成回退;針對(duì)DML語句,因?yàn)樽兏鼒?zhí)行后數(shù)據(jù)均已提交,一種方法是利用數(shù)據(jù)庫機(jī)制如Oracle閃回機(jī)制實(shí)現(xiàn)回退,此方法有幾個(gè)明顯的局限性,一是適用條件苛刻,如Oracle閃回機(jī)制本身具有多種約束條件限制,且其它多數(shù)數(shù)據(jù)庫并無類似的機(jī)制,二是可操作性不高,類似操作通常需要專門的數(shù)據(jù)庫維護(hù)人員,三是類似回退方法會(huì)影響變更后到回退前這段時(shí)間內(nèi)的其他數(shù)據(jù)變更,除非是變更完成后立即回退,所以通常還是利用手工方式完成DML回退。[0008]數(shù)據(jù)庫手工回退方法,在數(shù)據(jù)庫變更較小的情況下,是可以勝任回退任務(wù)的,但是又具備難以克服的缺陷。首先是人工成本高,因?yàn)樾枰斯ず瞬槊織l數(shù)據(jù)庫變更語句,然后編寫對(duì)應(yīng)的逆向語句,在變更比較大或比較頻繁的情況下,需要花費(fèi)大量的人力;其次是正確性無法保障,因?yàn)槭峭ㄟ^人工來完成逆向,缺乏有效的核對(duì)機(jī)制來確保工作的正確性,變更較大的情況下極易出錯(cuò);再次,手工回退需要確保變更涉及的表結(jié)構(gòu)、數(shù)據(jù)和權(quán)限在變更前得到備份,否則無法進(jìn)行回退;最后,操作效率低,針對(duì)大型的變更,人工操作效率不高,導(dǎo)致回退時(shí)間較長(zhǎng),因此會(huì)影響系統(tǒng)的可用性,導(dǎo)致其他一些間接的損失。[0009]除了手工回退外,還可以通過整庫備份恢復(fù)的方式進(jìn)行變更回退,即在變更實(shí)施前對(duì)整個(gè)數(shù)據(jù)庫進(jìn)行備份,變更完成后如果需要回退,則使用變更前的數(shù)據(jù)庫備份進(jìn)行恢復(fù)。[0010]至于整庫備份恢復(fù)回退方法,優(yōu)點(diǎn)是能夠完全恢復(fù)數(shù)據(jù)庫,但也存在明顯的缺陷。一是成本巨大,進(jìn)行整庫備份恢復(fù)通常需要停庫,這對(duì)于某些系統(tǒng)是不可接受的,且如果變更較小,進(jìn)行整庫備份恢復(fù)會(huì)導(dǎo)致較多的資源和時(shí)間消耗;二是專業(yè)性強(qiáng),整庫備份恢復(fù)需要專門的數(shù)據(jù)庫DBA來完成。[0011]因此,目前對(duì)數(shù)據(jù)庫變更的回退無論手工回退還是整庫回退,都存在明顯的缺陷。所以長(zhǎng)遠(yuǎn)看來,需要有一種方案,能夠解決手工回退和整庫回退的缺陷,完成對(duì)數(shù)據(jù)庫變更的自動(dòng)化回退?!?br/>發(fā)明內(nèi)容】[0012]本發(fā)明要解決的技術(shù)問題在于,針對(duì)現(xiàn)有技術(shù)的上述手工回退存在的效率低、成本高、正確性無法保障的缺陷以及整庫備存在的成本大、適用范圍太窄的缺陷,提供一種適用性廣、可操作性強(qiáng)、安全、高效自動(dòng)化的變更語句逆向分析方法、數(shù)據(jù)庫變更回退方法及系統(tǒng)。[0013]本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:構(gòu)造一種變更語句逆向分析方法,用于數(shù)據(jù)庫中在所述變更語句執(zhí)行之前進(jìn)行逆向分析生成回退語句,所述變更語句為SQL語句,所述方法包括以下步驟:[0014]S1、確定所述變更語句涉及的對(duì)象、變更指令和對(duì)應(yīng)于所述變更指令的回退指令;[0015]S2、如果所述變更語句進(jìn)行創(chuàng)建/增加操作,則直接根據(jù)所述對(duì)象和回退指令確定回退語句;[0016]如果所述變更語句進(jìn)行更改/刪除操作,則確定被更改/刪除的源數(shù)據(jù)/源內(nèi)容,并根據(jù)所述對(duì)象、源數(shù)據(jù)/源內(nèi)容和回退指令確定回退語句。[0017]本發(fā)明所述的變更語句逆向分析方法,其中,所述對(duì)象包括直接對(duì)象和與所述直接對(duì)象相關(guān)聯(lián)的關(guān)聯(lián)對(duì)象;[0018]所述步驟SI中,確定所述變更語句涉及的對(duì)象包括:根據(jù)所述變更語句直接獲取所述直接對(duì)象;和根據(jù)所述變更語句通過查詢數(shù)據(jù)字典間接獲取所述關(guān)聯(lián)對(duì)象;所述查詢數(shù)據(jù)字典是通過查詢語句查詢數(shù)據(jù)庫系統(tǒng);[0019]所述步驟S2中,確定被更改/刪除的源數(shù)據(jù)/源內(nèi)容包括:根據(jù)所述變更語句直接獲取所述源數(shù)據(jù)/源內(nèi)容;和根據(jù)所述變更語句通過查詢數(shù)據(jù)表間接獲取所述源數(shù)據(jù)/源內(nèi)容;所述查詢數(shù)據(jù)表是通過查詢語句查詢數(shù)據(jù)庫系統(tǒng)和數(shù)據(jù)表。[0020]本發(fā)明所述的變更語句逆向分析方法,其中,所述變更語句包括DDL語句、DML語句和DCL語句;[0021]若變更語句為DDL語句,所述方法包括:創(chuàng)建對(duì)象的回退、更新對(duì)象的回退和刪除對(duì)象的回退;[0022]若變更語句為DML語句,所述方法包括:新增數(shù)據(jù)的回退,更新數(shù)據(jù)的回退,刪除數(shù)據(jù)的回退;[0023]若變更語句為DCL語句,所述方法包括:授權(quán)語句的回退、權(quán)限回收語句的回退。[0024]本發(fā)明所述的變更語句逆向分析方法,其中,如果變更語句為CREATEMM_name;其中M代表創(chuàng)建對(duì)象的類型,M_name代表創(chuàng)建對(duì)象的名稱,所述創(chuàng)建對(duì)象的回退包括:[0025]Slal、確定所述變更語句涉及的對(duì)象為M_name,變更指令為CREATE,CREATE對(duì)應(yīng)的回退指令為DROP;[0026]S2al、所述變更語句僅進(jìn)行創(chuàng)建操作,直接確定所述回退語句為:DR0PMM_name;[0027]如果變更語句為ALTERMM_nameUD1,其中M代表更新對(duì)象的類型,M_name代表更新對(duì)象的名稱,UDl代表更新內(nèi)容的操作,UDl中涉及到的變更指令包括:ADD、DR0P和MODIFY,所述更新對(duì)象的回退包括:[0028]Sla2、確定所述變更語句涉及的對(duì)象為M_name,變更指令包括=CREATE和UDl中涉及到的變更指令,CREATE對(duì)應(yīng)的回退指令為DROP,ADD、DROP和MODIFY對(duì)應(yīng)的回退指令分別為DROP、ADD和MODIFY;[0029]S2a2、所述變更語句進(jìn)行更改操作,確定對(duì)應(yīng)于UDl的被更改的源內(nèi)容,確定所述回退語句為=ALTERMM_nameUD2,UD2代表由對(duì)應(yīng)于UDl的回退指令和源內(nèi)容構(gòu)成的實(shí)現(xiàn)回退的操作;[0030]如果變更語句為DROPMM_name;其中M代表刪除對(duì)象的類型,M_name代表刪除對(duì)象的名稱,所述刪除對(duì)象的回退包括:[0031]Sla3、確定所述變更語句涉及的對(duì)象為M_name,變更指令為DROP,DROP對(duì)應(yīng)的回退指令為CREATE;[0032]S2a3、所述變更語句進(jìn)行刪除操作,確定被刪除的源內(nèi)容,確定所述回退語句為:CREATEMM_nameUD3,UD3代表由源內(nèi)容構(gòu)成的限定條件;[0033]如果變更語句為INSERTINTOtb_aVALUESv_a,其中,tb_a代表新增數(shù)據(jù)的對(duì)象,v_a代表新增數(shù)據(jù),所述新增數(shù)據(jù)的回退包括:[0034]Slbl、確定所述變更語句涉及的對(duì)象為tb_a,變更指令為:INSERT,對(duì)應(yīng)的回退指令為DELETE;[0035]S2bl、所述變更語句進(jìn)行更改操作,直接確定所述回退語句為:DELETEFROMM_nameWHEREv_b,其中,v_b代表對(duì)應(yīng)于新增數(shù)據(jù)v_a對(duì)應(yīng)的字段;[0036]如果變更語句為UPDATEtb_aSETC,其中,tb_a代表更新數(shù)據(jù)的對(duì)象,c代表更新數(shù)據(jù)的操作,所述更新數(shù)據(jù)的回退包括:[0037]Slb2、確定所述變更語句涉及的對(duì)象為tb_a,變更指令為UPDATE,UPDATE對(duì)應(yīng)的回退指令為UPDATE;[0038]S2b2、所述變更語句進(jìn)行更改操作,確定對(duì)應(yīng)于c的源數(shù)據(jù),確定所述回退語句為:UPDATEtb_aSETdWHEREe,其中,d代表源數(shù)據(jù)的具體數(shù)據(jù),e代表源數(shù)據(jù)對(duì)應(yīng)的字段;[0039]如果變更語句為DELETEFROMtb_aWHEREc,其中,tb_a代表刪除數(shù)據(jù)的對(duì)象,c代表刪除數(shù)據(jù)對(duì)應(yīng)的字段,所述刪除數(shù)據(jù)的回退包括:[0040]Slb3、確定所述變更語句涉及的對(duì)象為tb_a,變更指令為:DELETE,DELETE對(duì)應(yīng)的回退指令為INSERT;[0041]S2b3、所述變更語句進(jìn)行刪除操作,確定對(duì)應(yīng)于c的源數(shù)據(jù),確定所述回退語句為:INSERTINTOtb_a(col_a)VALUESd,其中,d代表源數(shù)據(jù)的具體數(shù)據(jù),col_a代表源數(shù)據(jù)對(duì)應(yīng)的字段;[0042]如果變更語句為GRANTAUSERTOuser_a,所述授權(quán)語句的回退包括:[0043]Slcl、確定所述變更語句涉及的對(duì)象為user_a,變更指令為:GRANT,對(duì)應(yīng)的回退指令為REVOKE;[0044]S2cl、所述變更語句進(jìn)行授權(quán)操作,直接確定所述回退語句為:REV0KEAFROMuser_a;[0045]如果變更語句為REVOKEAONtb_aFROMrole_a;所述權(quán)限回收語句的回退包括:[0046]Slcl、確定所述變更語句涉及的對(duì)象為role_a,變更指令為:REV0KE,對(duì)應(yīng)的回退指令為GRANT;[0047]S2cl、所述變更語句進(jìn)行權(quán)限回收操作,直接確定所述回退語句為:GRANTAONtb_aTOrole_a。[0048]本發(fā)明還公開了一種基于所述的變更語句逆向分析方法的數(shù)據(jù)庫變更回退方法,所述方法包括以下步驟:[0049]S10、獲得SQL變更腳本輸入、數(shù)據(jù)庫版本和數(shù)據(jù)庫授權(quán);[0050]S20、對(duì)所述SQL變更腳本執(zhí)行解析,生成語句解析結(jié)果;[0051]S30、基于所述語句解析結(jié)果,根據(jù)所述變更語句逆向分析方法生成回退語句并將所述回退語句轉(zhuǎn)換為可執(zhí)行的回退SQL腳本文件。[0052]本發(fā)明所述的數(shù)據(jù)庫變更回退方法,其中,所述方法還包括:[0053]S40、輸入回退執(zhí)行命令,運(yùn)行所述回退SQL腳本文件實(shí)現(xiàn)數(shù)據(jù)庫變更回退。[0054]本發(fā)明所述的數(shù)據(jù)庫變更回退方法,其中,所述步驟SlO中,所述SQL變更腳本為包含所述變更語句的文本文件,所述數(shù)據(jù)庫授權(quán)包括數(shù)據(jù)庫用戶名和密碼;[0055]所述步驟S20中執(zhí)行解析為根據(jù)所述SQL變更腳本調(diào)用所述數(shù)據(jù)庫版本的SQL引擎執(zhí)行Flex詞法分析和Bison語法分析。[0056]本發(fā)明所述的數(shù)據(jù)庫變更回退方法,其中,所述步驟S30中根據(jù)所述變更語句逆向分析方法生成的回退語句為由若干子句構(gòu)成的邏輯回退語句,所述步驟S30將所述回退語句轉(zhuǎn)換為可執(zhí)行的回退SQL腳本文件具體包括:[0057]S31、重組:對(duì)所述子句進(jìn)行重新組織;[0058]S32、填充:將重組后的所述子句填充后形成完整且合法的SQL語句;[0059]S33、映射:將步驟S32中得到的具有不同實(shí)現(xiàn)的SQL語句映射為特定數(shù)據(jù)庫系統(tǒng)的語句;[0060]S34、合并:將數(shù)據(jù)導(dǎo)入命令和步驟S33中得到的語句合并為所述回退SQL腳本文件。[0061]本發(fā)明還提供一種基于所述的數(shù)據(jù)庫變更回退方法的數(shù)據(jù)庫變更回退系統(tǒng),所述系統(tǒng)包括:[0062]用戶接口層:用于與用戶進(jìn)行交互處理;所述交互處理包括獲得SQL變更腳本輸入、數(shù)據(jù)庫版本、數(shù)據(jù)庫授權(quán)以及回退執(zhí)行命令;[0063]回退處理層:用于對(duì)所述SQL變更腳本執(zhí)行解析,生成語句解析結(jié)果,并基于所述語句解析結(jié)果根據(jù)所述變更語句逆向分析方法生成回退語句,并將所述回退語句轉(zhuǎn)換為可執(zhí)行的回退SQL腳本文件;[0064]數(shù)據(jù)服務(wù)層:用于從數(shù)據(jù)庫查詢數(shù)據(jù)、進(jìn)行源數(shù)據(jù)/源內(nèi)容備份,以及在接收到所述回退執(zhí)行命令時(shí)執(zhí)行所述回退SQL腳本文件;[0065]數(shù)據(jù)庫層:提供數(shù)據(jù)庫系統(tǒng)。[0066]本發(fā)明所述的數(shù)據(jù)庫變更回退系統(tǒng),其中,[0067]所述用戶接口層的功能組件包括:[0068]命令處理組件:用于接收所述SQL變更腳本和回退執(zhí)行命令;[0069]信息交互組件:用于將所述數(shù)據(jù)庫回退的過程與結(jié)果展示給用戶;[0070]所述回退處理層的功能組件包括:[0071]SQL引擎:根據(jù)數(shù)據(jù)庫的詞法和語法規(guī)則,完成SQL變更腳本的解析并生成語句解析結(jié)果,SQL變更腳本的解析包括詞法分析和語法分析,所述詞法分析采用Flex工具,所述語法分析采用Bison工具;[0072]腳本解析組件:用于根據(jù)數(shù)據(jù)庫類型調(diào)用對(duì)應(yīng)的所述SQL引擎完成SQL變更腳本的解析;[0073]逆向分析組件:用于分析所述語句解析結(jié)果,根據(jù)所述變更語句逆向分析方法生成回退語句;[0074]回退語句生成組件:用于結(jié)合所述數(shù)據(jù)服務(wù)層,將回退語句轉(zhuǎn)換為和數(shù)據(jù)庫類型相關(guān)的SQL回退語句,并將生成的回退SQL腳本文件提供給數(shù)據(jù)服務(wù)層;[0075]所述數(shù)據(jù)服務(wù)層包括:[0076]數(shù)據(jù)查詢組件:用于從數(shù)據(jù)庫獲得所述SQL回退語句并生成需要的數(shù)據(jù);[0077]數(shù)據(jù)備份組件:用于對(duì)回退需要備份的源數(shù)據(jù)/源內(nèi)容進(jìn)行備份和管理;[0078]腳本執(zhí)行組件:用于獲取所述回退SQL腳本文件,完成回退SQL腳本文件的執(zhí)行;[0079]所述數(shù)據(jù)庫層包括:0racle、MySQL、Sybase、SQLServer系統(tǒng)。[0080]實(shí)施本發(fā)明的變更語句逆向分析方法、數(shù)據(jù)庫變更回退方法及系統(tǒng),具有以下有益效果:本發(fā)明的變更語句逆向分析方法在所述變更語句執(zhí)行之前進(jìn)行逆向分析生成回退語句,回退語句僅僅對(duì)變更語句涉及的對(duì)象或者對(duì)象的源數(shù)據(jù)/源內(nèi)容進(jìn)行回退,針對(duì)性強(qiáng),工作量小。數(shù)據(jù)庫變更回退方法利用該方法生成的回退語句,轉(zhuǎn)換為可執(zhí)行的回退SQL腳本文件,在需要進(jìn)行數(shù)據(jù)庫的回退時(shí),執(zhí)行回退SQL腳本文件即可,達(dá)到了適用性廣、可操作性強(qiáng)、安全、高效自動(dòng)化的優(yōu)點(diǎn)?!緦@綀D】【附圖說明】[0081]下面將結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步說明,附圖中:[0082]圖1是本發(fā)明變更語句逆向分析方法的流程圖;[0083]圖2A是本發(fā)明數(shù)據(jù)庫變更回退方法的第一實(shí)施例的流程圖;[0084]圖2B是本發(fā)明數(shù)據(jù)庫變更回退方法的第二實(shí)施例的流程圖;[0085]圖3是本發(fā)明數(shù)據(jù)庫變更回退方法中INSERT語句語法解析的最終語法樹;[0086]圖4是本發(fā)明數(shù)據(jù)庫變更回退系統(tǒng)的架構(gòu)層次圖;[0087]圖5是本發(fā)明數(shù)據(jù)庫變更回退系統(tǒng)的系統(tǒng)組件圖。【具體實(shí)施方式】[0088]為了對(duì)本發(fā)明的技術(shù)特征、目的和效果有更加清楚的理解,現(xiàn)對(duì)照附圖詳細(xì)說明本發(fā)明的【具體實(shí)施方式】。[0089]參考圖1是本發(fā)明變更語句逆向分析方法的流程圖;[0090]本發(fā)明的變更語句逆向分析方法,用于數(shù)據(jù)庫中在變更語句執(zhí)行之前進(jìn)行逆向分析生成回退語句,所述變更語句為SQL語句,方法包括以下步驟:[0091]S1、確定變更語句涉及的對(duì)象、變更指令和對(duì)應(yīng)于變更指令的回退指令;[0092]其中,對(duì)象包括直接對(duì)象和與直接對(duì)象相關(guān)聯(lián)的關(guān)聯(lián)對(duì)象,確定變更語句涉及的對(duì)象包括:根據(jù)變更語句直接獲取直接對(duì)象;和根據(jù)變更語句通過查詢數(shù)據(jù)字典間接獲取關(guān)聯(lián)對(duì)象;[0093]S2、如果變更語句進(jìn)行創(chuàng)建/增加操作,則直接根據(jù)對(duì)象和回退指令確定回退語句;如果變更語句進(jìn)行更改/刪除操作,則確定被更改/刪除的源數(shù)據(jù)/源內(nèi)容,并根據(jù)對(duì)象、源數(shù)據(jù)/源內(nèi)容和回退指令確定回退語句;[0094]確定被更改/刪除的源數(shù)據(jù)/源內(nèi)容包括:根據(jù)變更語句直接獲取源數(shù)據(jù)/源內(nèi)容;和根據(jù)變更語句通過查詢數(shù)據(jù)表間接獲取源數(shù)據(jù)/源內(nèi)容。其中,源內(nèi)容包括對(duì)象的詳細(xì)屬性以及與對(duì)象相關(guān)的數(shù)據(jù)和狀態(tài);[0095]查詢數(shù)據(jù)字典是指通過查詢語句查詢數(shù)據(jù)庫系統(tǒng),查詢數(shù)據(jù)表是指通過查詢語句查詢數(shù)據(jù)庫系統(tǒng)和數(shù)據(jù)表。[0096]本發(fā)明主要針對(duì)三類變更語句:DDL語句、DML語句和DCL語句:[0097]DDL是數(shù)據(jù)定義語言,主要用于定義、更新、刪除數(shù)據(jù)庫對(duì)象,通常的數(shù)據(jù)庫對(duì)象包含表、視圖、索引、約束、存儲(chǔ)過程、觸發(fā)器、角色、用戶等;DML是數(shù)據(jù)操縱語言,用于操作數(shù)據(jù)庫中的數(shù)據(jù)。通常是對(duì)數(shù)據(jù)的查詢、插入、更新、刪除;DCL是數(shù)據(jù)控制語言,用于系統(tǒng)角色控制和授權(quán),通常是對(duì)用戶和角色權(quán)限的授權(quán)和取消授權(quán)。[0098]若變更語句為DDL語句,方法包括:創(chuàng)建對(duì)象的回退、更新對(duì)象的回退和刪除對(duì)象的回退;[0099]若變更語句為DML語句,方法包括:新增數(shù)據(jù)的回退,更新數(shù)據(jù)的回退,刪除數(shù)據(jù)的回退,MERGE類數(shù)據(jù)變更語句的回退,具有復(fù)雜變更條件的數(shù)據(jù)變更語句的回退,可包含重復(fù)行的表數(shù)據(jù)變更的回退;[0100]若變更語句為DCL語句,方法包括:授權(quán)語句的回退、權(quán)限回收語句的回退。下面結(jié)合具體的例子介紹以上三類變更語句的逆向分析方法。[0101](al)創(chuàng)建對(duì)象的回退[0102]變更語句創(chuàng)建了數(shù)據(jù)庫對(duì)象,在變更前,數(shù)據(jù)庫并不存在這個(gè)對(duì)象,回退比較簡(jiǎn)單,刪除創(chuàng)建的數(shù)據(jù)庫對(duì)象即可:[0103]如果變更語句為CREATEMM_name;其中M代表創(chuàng)建對(duì)象的類型,M_name代表創(chuàng)建對(duì)象的名稱,創(chuàng)建對(duì)象的回退包括:[0104]Slal、確定變更語句涉及的對(duì)象為M_name,變更指令為CREATE,CREATE對(duì)應(yīng)的回退指令為DROP;[0105]S2al、變更語句僅進(jìn)行創(chuàng)建操作,直接確定回退語句為:DR0PMM_name;[0106]例如:[0107]al-1)變更語句:CREATETABLEtb_a;[0108]分析:涉及的對(duì)象為直接對(duì)象tb_a,變更指令為CREATE,則回退指令為DROP。[0109]對(duì)應(yīng)的回退語句:DR0PTABLEtb_a;[0110]al-2)變更語句:CREATEINDEXidx_a;[0111]分析:涉及的對(duì)象為直接對(duì)象idx_a,變更指令為CREATE,則回退指令為DROP。[0112]對(duì)應(yīng)的回退語句:DROPINDEXidx_a;[0113](a2)更新對(duì)象的回退[0114]更新對(duì)象的回退對(duì)更新的對(duì)象進(jìn)行了更改,所以需要備份被更改的源內(nèi)容:例如更前數(shù)據(jù)庫對(duì)象的詳細(xì)屬性。因?yàn)閷?duì)象更新可能會(huì)涉及到與該對(duì)象相關(guān)的關(guān)聯(lián)對(duì)象的變化,例如數(shù)據(jù)約束條件的變化,因?yàn)閿?shù)據(jù)約束,可能導(dǎo)致回退不成功,在這種情況下,源內(nèi)容還包括與對(duì)象相關(guān)的原來的數(shù)據(jù)。在備份源內(nèi)容的數(shù)據(jù)時(shí),如果涉及到某些行或者列,則可只備份具體的行和列,否則可能需要全表備份。[0115]如果變更語句為ALTERMM_nameUD1,其中M代表更新對(duì)象的類型,M_name代表更新對(duì)象的名稱,UDl代表更新內(nèi)容的操作,UDl中涉及到的變更指令包括:ADD、DR0P和MODIFY,更新對(duì)象的回退包括:[0116]Sla2、確定變更語句涉及的對(duì)象為M_name,變更指令包括:CREATE和UDl中涉及到的變更指令,CREATE對(duì)應(yīng)的回退指令為DROP,ADD、DROP和MODIFY對(duì)應(yīng)的回退指令分別為DROP、ADD和MODIFY;[0117]S2a2、變更語句進(jìn)行更改操作,確定對(duì)應(yīng)于UDl的被更改的源內(nèi)容,確定回退語句為:ALTERMM_nameUD2,UD2代表由對(duì)應(yīng)于UDl的回退指令和源內(nèi)容構(gòu)成的實(shí)現(xiàn)回退的操作;[0118]例如:[0119]a2-l)變更語句:ALTERTABLEtb_aADDcol_aINTEGERNOTNULL;[0120]分析:涉及的對(duì)象為直接對(duì)象tb_a,變更指令為ALTER和ADD,則回退指令為ALTER和DR0P,之前不存在col_a,因此,回退時(shí)需要?jiǎng)h除該列。[0121]對(duì)應(yīng)的回退語句:ALTERTABLEtb_aDROPCOLUMNcol_a;[0122]a2-2)變更語句:ALTERTABLEtb_aMODIFYcol_aVARCHAR2(32)DEFAULT‘TEST’NOTNULL;[0123]分析:涉及的對(duì)象為tb_a,變更指令為ALTER和MODIFY,則回退指令為ALTER和MODIFY,被更改的源內(nèi)容為col_a列的屬性:數(shù)據(jù)類型、缺省值和字段是否非空。變更將數(shù)據(jù)表tb_a的列col_a類型修改為VARCHAR232,缺省值為字符串‘TEST’,字段非空,在變更語句中并不知道變更前列col_a的數(shù)據(jù)類型,因此需要先獲得變更前列col_a的數(shù)據(jù)類型,通過如下查詢語句查詢數(shù)據(jù)表:[0124]SELECTdata_type,data_length,nullable,nvl2(data_default,’N,,,Y,)default_existFROMuser_tab_columnsWHEREtable_name=UPPER(’tb_a’)andcolumn_name=upper('col_a');[0125]假設(shè)如上語句獲取到的結(jié)果為:VARCHAR2,16,‘N’,’Y’,則表示列col_a原來的數(shù)據(jù)類型為VARCHAR2,長(zhǎng)度為16,是非空字段,且存在缺省值,那么還需要獲取其原來的缺省值,可通過如下語句獲取:[0126]【權(quán)利要求】1.一種變更語句逆向分析方法,其特征在于,用于數(shù)據(jù)庫中在所述變更語句執(zhí)行之前進(jìn)行逆向分析生成回退語句,所述變更語句為SQL語句,所述方法包括以下步驟:51、確定所述變更語句涉及的對(duì)象、變更指令和對(duì)應(yīng)于所述變更指令的回退指令;52、如果所述變更語句進(jìn)行創(chuàng)建/增加操作,則直接根據(jù)所述對(duì)象和回退指令確定回退語句;如果所述變更語句進(jìn)行更改/刪除操作,則確定被更改/刪除的源數(shù)據(jù)/源內(nèi)容,并根據(jù)所述對(duì)象、源數(shù)據(jù)/源內(nèi)容和回退指令確定回退語句。2.根據(jù)權(quán)利要求1所述的變更語句逆向分析方法,其特征在于,所述對(duì)象包括直接對(duì)象和與所述直接對(duì)象相關(guān)聯(lián)的關(guān)聯(lián)對(duì)象;所述步驟SI中,確定所述變更語句涉及的對(duì)象包括:根據(jù)所述變更語句直接獲取所述直接對(duì)象;和根據(jù)所述變更語句通過查詢數(shù)據(jù)字典間接獲取所述關(guān)聯(lián)對(duì)象;所述查詢數(shù)據(jù)字典是通過查詢語句查詢數(shù)據(jù)庫系統(tǒng);所述步驟S2中,確定被更改/刪除的源數(shù)據(jù)/源內(nèi)容包括:根據(jù)所述變更語句直接獲取所述源數(shù)據(jù)/源內(nèi)容;和根據(jù)所述變更語句通過查詢數(shù)據(jù)表間接獲取所述源數(shù)據(jù)/源內(nèi)容;所述查詢數(shù)據(jù)表是通過查詢語句查詢數(shù)據(jù)庫系統(tǒng)和數(shù)據(jù)表。3.根據(jù)權(quán)利要求2所述的變更語句逆向分析方法,其特征在于,所述變更語句包括DDL語句、DML語句和DCL語句;若變更語句為DDL語句,所述方法包括:創(chuàng)建對(duì)象的回退、更新對(duì)象的回退和刪除對(duì)象的回退;若變更語句為DML語句,所述方法包括:新增數(shù)據(jù)的回退,更新數(shù)據(jù)的回退,刪除數(shù)據(jù)的回退;若變更語句為DCL語句,所述方法包括:授權(quán)語句的回退、權(quán)限回收語句的回退。4.根據(jù)權(quán)利要求3所述的變更語句逆向分析方法,其特征在于,如果變更語句為CREATEMM_name;其中M代表創(chuàng)建對(duì)象的類型,M_name代表創(chuàng)建對(duì)象的名稱,所述創(chuàng)建對(duì)象的回退包括:Slal、確定所述變更語句涉及的對(duì)象為M_name,變更指令為CREATE,CREATE對(duì)應(yīng)的回退指令為DROP;S2al、所述變更語句僅進(jìn)行創(chuàng)建操作,直接確定所述回退語句為:DR0PMM_name;如果變更語句為ALTERMM_nameUDl,其中M代表更新對(duì)象的類型,M_name代表更新對(duì)象的名稱,I代表更新內(nèi)容的操作,I中涉及到的變更指令包括:ADD、DROP和MODIFY,所述更新對(duì)象的回退包括:Sla2、確定所述變更語句涉及的對(duì)象為M_name,變更指令包括=CREATE和UDl中涉及到的變更指令,CREATE對(duì)應(yīng)的回退指令為DROP,ADD、DROP和MODIFY對(duì)應(yīng)的回退指令分別為DROP、ADD和MODIFY;S2a2、所述變更語句進(jìn)行更改操作,確定對(duì)應(yīng)于UDl的被更改的源內(nèi)容,確定所述回退語句為:ALTERMM_nameUD2,UD2代表由對(duì)應(yīng)于UDl的回退指令和源內(nèi)容構(gòu)成的實(shí)現(xiàn)回退的操作;如果變更語句為DROPMM_name;其中M代表刪除對(duì)象的類型,M_name代表刪除對(duì)象的名稱,所述刪除對(duì)象的回退包括:Sla3、確定所述變更語句涉及的對(duì)象為M_name,變更指令為DROP,DROP對(duì)應(yīng)的回退指令為CREATE;S2a3、所述變更語句進(jìn)行刪除操作,確定被刪除的源內(nèi)容,確定所述回退語句為:CREATEMM_nameUD3,UD3代表由源內(nèi)容構(gòu)成的限定條件;如果變更語句為INSERTINTOtb_aVALUESv_a,其中,tb_a代表新增數(shù)據(jù)的對(duì)象,v_a代表新增數(shù)據(jù),所述新增數(shù)據(jù)的回退包括:Slbl、確定所述變更語句涉及的對(duì)象為tb_a,變更指令為:INSERT,對(duì)應(yīng)的回退指令為DELETE;S2bl、所述變更語句進(jìn)行更改操作,直接確定所述回退語句為:DELETEFROMM_nameWHEREv_b,其中,v_b代表對(duì)應(yīng)于新增數(shù)據(jù)v_a對(duì)應(yīng)的字段;如果變更語句為UPDATEtb_aSETc,其中,tb_a代表更新數(shù)據(jù)的對(duì)象,c代表更新數(shù)據(jù)的操作,所述更新數(shù)據(jù)的回退包括:Slb2、確定所述變更語句涉及的對(duì)象為tb_a,變更指令為UPDATE,UPDATE對(duì)應(yīng)的回退指令為UPDATE;S2b2、所述變更語句進(jìn)行更改操作,確定對(duì)應(yīng)于c的源數(shù)據(jù),確定所述回退語句為:UPDATEtb_aSETdWHEREe,其中,d代表源數(shù)據(jù)的具體數(shù)據(jù),e代表源數(shù)據(jù)對(duì)應(yīng)的字段;如果變更語句為DELETEFROMtb_aWHEREc,其中,tb_a代表刪除數(shù)據(jù)的對(duì)象,c代表刪除數(shù)據(jù)對(duì)應(yīng)的字段,所述刪除數(shù)據(jù)的回退包括:Slb3、確定所述變更語句涉及的對(duì)象為tb_a,變更指令為:DELETE,DELETE對(duì)應(yīng)的回退指令為INSERT;S2b3、所述變更語句進(jìn)行刪除操作`,確定對(duì)應(yīng)于c的源數(shù)據(jù),確定所述回退語句為:INSERTINTOtb_a(col_a)VALUESd,其中,d代表源數(shù)據(jù)的具體數(shù)據(jù),col_a代表源數(shù)據(jù)對(duì)應(yīng)的字段;如果變更語句為GRANTAUSERTOuser_a,所述授權(quán)語句的回退包括:Slcl、確定所述變更語句涉及的對(duì)象為user_a,變更指令為:GRANT,對(duì)應(yīng)的回退指令為REVOKE;S2cl、所述變更語句進(jìn)行授權(quán)操作,直接確定所述回退語句為:REV0KEAFROMuser_a;如果變更語句為REVOKEAONtb_aFROMrole_a;所述權(quán)限回收語句的回退包括:Slcl、確定所述變更語句涉及的對(duì)象為role_a,變更指令為:REVOKE,對(duì)應(yīng)的回退指令為GRANT;S2cl、所述變更語句進(jìn)行權(quán)限回收操作,直接確定所述回退語句為:GRANTAONtb_aTOrole_a05.一種基于權(quán)利要求1-4任一項(xiàng)所述的變更語句逆向分析方法的數(shù)據(jù)庫變更回退方法,其特征在于,所述方法包括以下步驟:S10、獲得SQL變更腳本輸入、數(shù)據(jù)庫版本和數(shù)據(jù)庫授權(quán);S20、對(duì)所述SQL變更腳本執(zhí)行解析,生成語句解析結(jié)果;S30、基于所述語句解析結(jié)果,根據(jù)所述變更語句逆向分析方法生成回退語句并將所述回退語句轉(zhuǎn)換為可執(zhí)行的回退SQL腳本文件。6.根據(jù)權(quán)利要求5所述的數(shù)據(jù)庫變更回退方法,其特征在于,所述方法還包括:S40、輸入回退執(zhí)行命令,運(yùn)行所述回退SQL腳本文件實(shí)現(xiàn)數(shù)據(jù)庫變更回退。7.根據(jù)權(quán)利要求5所述的數(shù)據(jù)庫變更回退方法,其特征在于,所述步驟SlO中,所述SQL變更腳本為包含所述變更語句的文本文件,所述數(shù)據(jù)庫授權(quán)包括數(shù)據(jù)庫用戶名和密碼;所述步驟S20中執(zhí)行解析為根據(jù)所述SQL變更腳本調(diào)用所述數(shù)據(jù)庫版本的SQL引擎執(zhí)行Flex詞法分析和Bison語法分析。8.根據(jù)權(quán)利要求5所述的數(shù)據(jù)庫變更回退方法,其特征在于,所述步驟S30中根據(jù)所述變更語句逆向分析方法生成的回退語句為由若干子句構(gòu)成的邏輯回退語句,所述步驟S30將所述回退語句轉(zhuǎn)換為可執(zhí)行的回退SQL腳本文件具體包括:531、重組:對(duì)所述子句進(jìn)行重新組織;532、填充:將重組后的所述子句填充后形成完整且合法的SQL語句;533、映射:將步驟S32中得到的具有不同實(shí)現(xiàn)的SQL語句映射為特定數(shù)據(jù)庫系統(tǒng)的語句;534、合并:將數(shù)據(jù)導(dǎo)入命令和步驟S33中得到的語句合并為所述回退SQL腳本文件。9.一種基于權(quán)利要求5所述的數(shù)據(jù)庫變更回退方法的數(shù)據(jù)庫變更回退系統(tǒng),其特征在于,所述系統(tǒng)包括:用戶接口層(100):用于與用戶進(jìn)行交互處理;所述交互處理包括獲得SQL變更腳本輸入、數(shù)據(jù)庫版本、數(shù)據(jù)庫授權(quán)以及回退執(zhí)行命令;回退處理層(200):用于對(duì)所述SQL變更腳本執(zhí)行解析,生成語句解析結(jié)果,并基于所述語句解析結(jié)果根據(jù)所述變更語句逆向分析方法生成回退語句,并將所述回退語句轉(zhuǎn)換為可執(zhí)行的回退SQL腳本文件;數(shù)據(jù)服務(wù)層(300):用于從數(shù)據(jù)庫查詢數(shù)據(jù)、進(jìn)行源數(shù)據(jù)/源內(nèi)容備份,以及在接收到所述回退執(zhí)行命令時(shí)執(zhí)行所述回退SQL腳本文件;數(shù)據(jù)庫層(400):提供數(shù)據(jù)庫系統(tǒng)。10.根據(jù)權(quán)利要求9所述的數(shù)據(jù)庫變更回退系統(tǒng),其特征在于,所述用戶接口層(100)的功能組件包括:命令處理組件(101):用于接收所述SQL變更腳本和回退執(zhí)行命令;信息交互組件(102):用于將所述數(shù)據(jù)庫回退的過程與結(jié)果展示給用戶;所述回退處理層(200)的功能組件包括:SQL引擎(201):根據(jù)數(shù)據(jù)庫的詞法和語法規(guī)則,完成SQL變更腳本的解析并生成語句解析結(jié)果,SQL變更腳本的解析包括詞法分析和語法分析,所述詞法分析采用Flex工具,所述語法分析采用Bison工具;腳本解析組件(202):用于根據(jù)數(shù)據(jù)庫類型調(diào)用對(duì)應(yīng)的所述SQL引擎(201)完成SQL變更腳本的解析;逆向分析組件(203):用于分析所述語句解析結(jié)果,根據(jù)所述變更語句逆向分析方法生成回退語句;回退語句生成組件(204):用于結(jié)合所述數(shù)據(jù)服務(wù)層(300),將回退語句轉(zhuǎn)換為和數(shù)據(jù)庫類型相關(guān)的SQL回退語句,并將生成的回退SQL腳本文件提供給數(shù)據(jù)服務(wù)層(300);所述數(shù)據(jù)服務(wù)層(300)包括:數(shù)據(jù)查詢組件(301):用于從數(shù)據(jù)庫獲得所述SQL回退語句并生成需要的數(shù)據(jù);數(shù)據(jù)備份組件(302):用于對(duì)回退需要備份的源數(shù)據(jù)/源內(nèi)容進(jìn)行備份和管理;腳本執(zhí)行組件(303):用于獲取所述回退SQL腳本文件,完成回退SQL腳本文件的執(zhí)行;所述數(shù)據(jù)庫層(400)包括:Oracle、MySQL、Sybase、SQLServer系統(tǒng)?!疚臋n編號(hào)】G06F17/30GK103678532SQ201310634777【公開日】2014年3月26日申請(qǐng)日期:2013年12月2日優(yōu)先權(quán)日:2013年12月2日【發(fā)明者】陳卓,張愛民,琚彬,姚蕓,陳春松,韓林申請(qǐng)人:中國(guó)移動(dòng)(深圳)有限公司