數(shù)據(jù)庫觸發(fā)器機(jī)投影的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
數(shù)據(jù)庫觸發(fā)器機(jī)投影的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
數(shù)據(jù)庫觸發(fā)器機(jī)投影的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、    數(shù)據(jù)庫觸發(fā)器機(jī)投影的設(shè)計(jì)與實(shí)現(xiàn)    數(shù)據(jù)庫觸發(fā)器機(jī)投影的設(shè)計(jì)與實(shí)現(xiàn)    類別:通信網(wǎng)絡(luò)      觸發(fā)器機(jī)制實(shí)現(xiàn)的關(guān)鍵技術(shù)問題,并以gkd-base為原型,在已有的gkd-base pl/sql引擎基礎(chǔ)上實(shí)現(xiàn)了數(shù)據(jù)庫的觸發(fā)器功能。數(shù)據(jù)庫管理系統(tǒng)作為信息系統(tǒng)的核心部件,在信息化時(shí)代所充當(dāng)?shù)慕巧瞧渌魏诬浖荒芴娲?。?dāng)前數(shù)據(jù)庫應(yīng)用的一個(gè)普遍要求是數(shù)據(jù)庫管理系統(tǒng)能夠在一些數(shù)據(jù)庫相關(guān)事件發(fā)生時(shí)觸發(fā)預(yù)先定義的

2、操作,實(shí)現(xiàn)信息管理的自動化,因此引進(jìn)了觸發(fā)器機(jī)制。觸發(fā)器可以增強(qiáng)引用完整性,加強(qiáng)復(fù)雜業(yè)務(wù)的規(guī)則,或者監(jiān)控?cái)?shù)據(jù)庫的變動,并執(zhí)行一定的數(shù)據(jù)操作。觸發(fā)器機(jī)制實(shí)現(xiàn)主要涉及觸發(fā)事件的檢測以及觸發(fā)條件的判決等關(guān)鍵技術(shù)問題,以及對觸發(fā)器的編譯存儲和調(diào)用執(zhí)行等具體操作。本文對國產(chǎn)數(shù)據(jù)庫管理系統(tǒng)gkd-base為原型,在兼容oracle規(guī)范的pl/sql引擎基礎(chǔ)上,提出一套解決方案,對觸發(fā)器的關(guān)鍵技術(shù)問題進(jìn)行了探討,并設(shè)計(jì)實(shí)現(xiàn)了數(shù)據(jù)庫的觸發(fā)器機(jī)制,擴(kuò)展了數(shù)據(jù)庫管理系統(tǒng)gkd-base的功能。1 gkd-base pl/sql引擎gkd-base數(shù)據(jù)庫是一個(gè)具有自主知識產(chǎn)權(quán)的數(shù)據(jù)庫管理系統(tǒng),具有兼容sql89標(biāo)準(zhǔn)

3、的sql引擎,能夠?yàn)橛脩籼峁┮粋€(gè)統(tǒng)一、有效的數(shù)據(jù)庫訪問接口(xapi),實(shí)現(xiàn)對數(shù)據(jù)庫各種操作。為了融合sql語音強(qiáng)大的集合數(shù)據(jù)處理能力和第三代語音(3gl)靈活的過程處理能力,在gkd-base上已初步實(shí)現(xiàn)了兼容oarcle pl/sql v.23的pl/sql引擎。圖1    gkd-base pl/sql引擎包括編譯器、解釋器和異常處理三個(gè)模塊。在編譯階段,根據(jù)pl/sql語音兼有過程式語句和sql語句的特點(diǎn),采取分而治之策略,把過程語句和sql語句分開處理。對于sql語句,編譯器首先建立sql語句結(jié)點(diǎn),進(jìn)行相應(yīng)的變量綁定和語法檢查;檢查無誤后產(chǎn)生語

4、法樹形式的中間代碼。對于過程語句,編譯器將對語句成分進(jìn)行語法分析,對聲明的變量和數(shù)據(jù)類型建立相應(yīng)的符號表,最終產(chǎn)生語法樹形式垢中間代碼。解釋器的作用是對編譯器生成扣間代碼進(jìn)行解釋執(zhí)行。解釋器與編譯器對應(yīng),具有相對獨(dú)立的sql語句解釋模塊和過程語句解釋模塊。另外,解釋器還包括執(zhí)行狀態(tài)堆棧的管理、與gkd-base sql引擎的調(diào)用接口。異常處理模塊主要實(shí)現(xiàn)程序運(yùn)行時(shí)的錯(cuò)誤檢查和報(bào)告,并支持用戶自定義異常和預(yù)定義異常的檢查和處理。gkd-base pl/sql引擎可以實(shí)現(xiàn)對過程式語句、sql語句與游標(biāo)、存儲子程序及飯的編譯和解釋執(zhí)行。2 觸發(fā)器實(shí)現(xiàn)的關(guān)鍵問題觸發(fā)器定義了當(dāng)其些數(shù)據(jù)庫相關(guān)事件發(fā)生時(shí)數(shù)

5、據(jù)庫應(yīng)采取的動作。觸發(fā)器可增強(qiáng)引用完整性,加強(qiáng)復(fù)雜業(yè)務(wù)的規(guī)則,或者監(jiān)控?cái)?shù)據(jù)庫的變動,其實(shí)現(xiàn)主要涉及到觸發(fā)事件的檢測以及觸發(fā)條件的判決等關(guān)鍵技術(shù)問題。21 觸發(fā)器的事件檢測機(jī)制觸發(fā)器事件檢測機(jī)制包括對事件的檢測和存儲,是實(shí)現(xiàn)觸發(fā)器的關(guān)鍵。觸發(fā)器檢測的事件類型比較簡單,基本事件主要包括對數(shù)據(jù)的插入、刪除以及更新等。gkd-base的觸發(fā)器在對事件檢測時(shí),直接在相關(guān)事件發(fā)生的前后調(diào)用檢測函數(shù)截獲并分析事件消息,以確定是否對觸發(fā)器點(diǎn)火。觸發(fā)器事件檢測機(jī)制實(shí)現(xiàn)的關(guān)鍵在于對觸發(fā)事件的存儲。觸發(fā)事件具有時(shí)間順序,因此存儲時(shí)也必須按照嚴(yán)格的時(shí)間順序進(jìn)行存儲。綜合比較各個(gè)商用和實(shí)驗(yàn)數(shù)據(jù)庫系統(tǒng)的事件表存儲機(jī)制,選

6、擇了startburst的雙hash鏈表存儲機(jī)制,如圖1。這里,變遷表分為兩種類型:new和old,分別對應(yīng)于觸發(fā)器行級別操作中的new值和old值。變遷表中存了事件類型、當(dāng)前數(shù)據(jù)表以及事件作用的元組。系統(tǒng)可以通過這個(gè)駐留內(nèi)存的雙hash鏈表實(shí)現(xiàn)數(shù)據(jù)庫變遷的快速定位和跟蹤處理。22 觸發(fā)器的條件判決機(jī)制觸發(fā)器的條件判決機(jī)制是觸發(fā)器的核心,根據(jù)sql99標(biāo)準(zhǔn)的定義,可以將觸發(fā)器分為前觸發(fā)、結(jié)束判定和后觸發(fā)三種類型。這三種類型觸發(fā)器的判決順序策略如圖2。圖2    觸發(fā)器的條件評估是影響觸發(fā)器機(jī)制是最關(guān)鍵因素。在數(shù)據(jù)庫環(huán)境中,大多數(shù)數(shù)據(jù)修改行為只能影響數(shù)據(jù)庫

7、的一小部分內(nèi)容,因此沒必要每次都從頭開始評估觸發(fā)器規(guī)則條件,rete和treat網(wǎng)絡(luò)等增量條件評估方法已經(jīng)被證明是觸發(fā)器條件評估(condition evaluation)的有效處理手段。以rete網(wǎng)絡(luò)為例(圖3),它是一個(gè)左深度二叉樹,其基本元素包括:根結(jié)點(diǎn):根結(jié)點(diǎn)接收插入/刪除(+/-)記號(tokens),并將其傳遞給每一個(gè)后繼結(jié)點(diǎn);t-const結(jié)點(diǎn):記號到達(dá)這些結(jié)點(diǎn)后,將根據(jù)該結(jié)點(diǎn)上的條件謂詞進(jìn)行判決,那些通過測試的記號將繼續(xù)傳播下去,沒有通過測試的記號則被丟棄掉;-存儲結(jié)點(diǎn):通過t-const結(jié)點(diǎn)測試的記號將存儲到這個(gè)結(jié)點(diǎn)中,存儲在-存儲結(jié)點(diǎn)中的每一個(gè)記號都將同時(shí)被傳遞給該結(jié)點(diǎn)的后

8、繼結(jié)點(diǎn);and(連接)結(jié)點(diǎn):這些結(jié)點(diǎn)有兩個(gè)輸入,到達(dá)其中任意一個(gè)輸入結(jié)點(diǎn)的記號都要通過and結(jié)點(diǎn)進(jìn)行測試,看它是否需要與另外一個(gè)輸入進(jìn)行連接操作。如果是,則連接兩個(gè)輸入的記號時(shí),將它們合并成一個(gè)組合記號后再傳遞給后續(xù)的-存儲結(jié)點(diǎn);-存儲結(jié)點(diǎn):存儲連接結(jié)點(diǎn)的輸出,并將輸出同時(shí)傳遞給后繼結(jié)點(diǎn);p-結(jié)點(diǎn)(規(guī)則結(jié)點(diǎn)):+記號到達(dá)這里表明應(yīng)該喚醒一個(gè)與該記號相關(guān)聯(lián)的規(guī)則實(shí)例;-記號到達(dá)這里表明與其中的標(biāo)簽對象相關(guān)聯(lián)的已經(jīng)進(jìn)入待執(zhí)行隊(duì)列的規(guī)則實(shí)例應(yīng)該被刪除。rete網(wǎng)絡(luò)只支持兩路連接,對于一個(gè)有多個(gè)關(guān)系參與的規(guī)則定義,不同的連接順序可以得到不同的rete網(wǎng)絡(luò),根據(jù)數(shù)據(jù)字典信息可以選擇最優(yōu)的執(zhí)行順序。圖3是

9、對應(yīng)于規(guī)則條件“a.color”="bule"and a.x<b.x and b.x<c.x"的rete網(wǎng)絡(luò)示意圖。3 觸發(fā)器實(shí)現(xiàn)算法觸發(fā)器的具體實(shí)現(xiàn)可以分為觸發(fā)器創(chuàng)建和調(diào)用,此外還包括觸發(fā)器的修改、刪除等操作。其中觸發(fā)器的創(chuàng)建包括觸發(fā)器的編譯與存儲操作,觸發(fā)器的調(diào)用包括對觸發(fā)器事件的檢測和觸發(fā)器動作的執(zhí)行。圖3    31 創(chuàng)建觸發(fā)器觸發(fā)器的創(chuàng)建包括觸發(fā)器的編譯和存儲。觸發(fā)器的編譯涉及到觸發(fā)器的命名、觸發(fā)器事件的正確性檢查、觸發(fā)器引用表的合法性檢查以及觸發(fā)器主體的語法檢查。觸發(fā)器創(chuàng)建之前首先要檢查用戶是否有創(chuàng)建

10、觸發(fā)器的權(quán)限,以及觸發(fā)器名是否已經(jīng)在存儲觸發(fā)器的數(shù)字典中被使用。觸發(fā)事件部分在解發(fā)器創(chuàng)建時(shí)要進(jìn)行檢查,需要檢查的內(nèi)容包括語法檢查、觸發(fā)器引用的表和更是否存在,以及用戶是否有針對這個(gè)表創(chuàng)建觸發(fā)器的權(quán)限。表和列的存在與否可能先調(diào)用gkd-base的xapi函數(shù)分析出dml語句中表和列的信息,然后根據(jù)這些信息檢查數(shù)字字典;權(quán)限的檢查也要到數(shù)字字節(jié)中查詢。觸發(fā)器的語法檢查通過調(diào)用pl/sql引擎的編譯器實(shí)現(xiàn);pl/sql引擎編譯器對觸發(fā)器過程語句塊進(jìn)行編譯,并生成包含觸發(fā)器所有必要信息的語法樹形式的中間代碼。保存觸發(fā)器相關(guān)信息的數(shù)據(jù)結(jié)構(gòu)最終需要保存的數(shù)據(jù)字典中。因?yàn)橛|發(fā)器使用單獨(dú)的命名空間,可以設(shè)計(jì)一

11、個(gè)單獨(dú)的系統(tǒng)表作為存儲觸發(fā)器的數(shù)據(jù)字典。數(shù)據(jù)字典應(yīng)該保存觸發(fā)器調(diào)用過程中必須的信息,類似于oracle sys.trigger$表。觸發(fā)器主體是一個(gè)語句塊,對它可以當(dāng)作一個(gè)存儲過程來處理,單獨(dú)保存在一個(gè)系統(tǒng)表中,通過觸發(fā)器主體的id號與存儲在user_triggers表中的其它觸發(fā)器信息相關(guān)聯(lián)。在觸發(fā)器調(diào)用過程中,根據(jù)觸發(fā)器中的id來調(diào)用。創(chuàng)建觸發(fā)器算法如下:(1) 合法性驗(yàn)證。如當(dāng)前用戶無權(quán)執(zhí)行該操作,或者用戶給出的表不存在,轉(zhuǎn)(6);否則轉(zhuǎn)(2)。(2) 存在性檢查。如當(dāng)前定義的觸發(fā)器與當(dāng)前表以往定義的觸發(fā)器名名或同類型,轉(zhuǎn)(6);否則轉(zhuǎn)(3)。(3) 語法檢查。調(diào)用pl/sql引擎編譯器

12、對觸發(fā)器語句進(jìn)行編譯,如出現(xiàn)語法或語義錯(cuò)誤,轉(zhuǎn)(6);否則轉(zhuǎn)(4)。(4) 將觸發(fā)器信息寫入外存,然后返回觸發(fā)器標(biāo)識id。(5) 在數(shù)據(jù)庫表結(jié)構(gòu)的系統(tǒng)表中將(4)中所得標(biāo)識與觸發(fā)器名填入其中,然后將觸發(fā)器定義的表項(xiàng)插入到user_triggers相應(yīng)的系統(tǒng)表項(xiàng)中,轉(zhuǎn)(7)。(6) 釋放所占資源,報(bào)錯(cuò)退出。(7) 釋放資源,正常退出。3 2 觸發(fā)器的調(diào)用觸發(fā)器的調(diào)用首先要從外存中讀取觸發(fā)器的信息,并寫入內(nèi)存相應(yīng)的數(shù)據(jù)結(jié)構(gòu)中。觸發(fā)器的內(nèi)存形式是為了更方便地進(jìn)行觸發(fā)器結(jié)束條件的檢查而設(shè)立的。為了在觸發(fā)事件發(fā)生時(shí),能立即判斷當(dāng)前被處理對象是否滿足觸發(fā)結(jié)束條件通過調(diào)用pl/sql引擎編譯器將外存中存放觸

13、發(fā)器結(jié)束源代碼轉(zhuǎn)換為其內(nèi)存表示,存放在相應(yīng)觸發(fā)器的內(nèi)存結(jié)構(gòu)中。在觸發(fā)器被調(diào)用前,系統(tǒng)將被同一觸發(fā)事件所觸發(fā)的所有活躍的觸發(fā)器組織成四條鏈,如圖4。根據(jù)這個(gè)數(shù)據(jù)結(jié)構(gòu),觸發(fā)器調(diào)用算法如下:(1) 將與觸發(fā)事件相關(guān)的觸發(fā)器按類型分別記入sb、sa、rb和ra四條鏈中;如沒有某種類型的觸發(fā)器,則相應(yīng)鏈置空。(2) 如sh不為空,則轉(zhuǎn)sb鏈觸發(fā)操作算法。(3) 如rb不為空,則轉(zhuǎn)rb鏈觸發(fā)操作算法。(4) 對當(dāng)前數(shù)據(jù)對象進(jìn)行觸發(fā)事件所規(guī)定的dml操作。(5) 如ra不為空,則轉(zhuǎn)ra鏈觸發(fā)操作算法。(6) 判斷觸發(fā)事件所作用的數(shù)據(jù)記錄是否都被處理完畢,如是,轉(zhuǎn)(7);否則,取出下一條記錄作為當(dāng)前的數(shù)據(jù)對象,轉(zhuǎn)(3)。(7) 如sa不為空,則轉(zhuǎn)sa鏈觸發(fā)操作算法。(8) 釋放所占的資源,結(jié)束觸發(fā)器調(diào)用的處理。    對給定觸發(fā)器鏈操作算法如下:(1) 根據(jù)觸發(fā)器調(diào)用算法檢測,當(dāng)前觸發(fā)器鏈不為空,取鏈?zhǔn)子|發(fā)器。(2) 將待處理數(shù)據(jù)對象的相關(guān)信息代入觸發(fā)條件判斷,如果條件為真,轉(zhuǎn)(3);否

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論