摘 要: 根據(jù)當(dāng)前數(shù)據(jù)庫應(yīng)用需求和技術(shù)發(fā)展現(xiàn)狀,,研究了數(shù)據(jù)庫管理系統(tǒng)" title="管理系統(tǒng)">管理系統(tǒng)觸發(fā)器機(jī)制實(shí)現(xiàn)的關(guān)鍵技術(shù)問題,,并以GKD-Base" title="GKD-Base">GKD-Base為原型,,在已有的GKD-Base PL/SQL引擎基礎(chǔ)上實(shí)現(xiàn)了數(shù)據(jù)庫的觸發(fā)器功能,。
關(guān)鍵詞: PL/SQL引擎 Rete網(wǎng)絡(luò) 雙Hash結(jié)構(gòu) 觸發(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ù)先定義的操作,,實(shí)現(xiàn)信息管理的自動(dòng)化,,因此引進(jìn)了觸發(fā)器機(jī)制,。觸發(fā)器可以增強(qiáng)引用完整性,加強(qiáng)復(fù)雜業(yè)務(wù)的規(guī)則,,或者監(jiān)控?cái)?shù)據(jù)庫的變動(dòng),,并執(zhí)行一定的數(shù)據(jù)操作。
觸發(fā)器機(jī)制實(shí)現(xiàn)主要涉及觸發(fā)事件的檢測(cè)以及觸發(fā)條件的判決等關(guān)鍵技術(shù)問題,,以及對(duì)觸發(fā)器的編譯存儲(chǔ)和調(diào)用執(zhí)行等具體操作,。
本文以國產(chǎn)數(shù)據(jù)庫管理系統(tǒng)GKD-Base為原型,在兼容Oracle 規(guī)范的PL/SQL引擎基礎(chǔ)上,,提出一套解決方案,,對(duì)觸發(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è)具有自主知識(shí)產(chǎn)權(quán)的數(shù)據(jù)庫管理系統(tǒng),具有兼容SQL89標(biāo)準(zhǔn)的SQL引擎,,能夠?yàn)橛脩籼峁┮粋€(gè)統(tǒng)一,、有效的數(shù)據(jù)庫訪問接口(XAPI),實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的各種操作,。為了融合SQL語言強(qiáng)大的集合數(shù)據(jù)處理能力" title="處理能力">處理能力和第三代語言(3GL)靈活的過程處理能力,,在GKD-Base上已初步實(shí)現(xiàn)了兼容Oarcle PL/SQL V.23的PL/SQL引擎。
GKD-Base PL/SQL引擎包括編譯器,、解釋器和異常處理三個(gè)模塊,。在編譯階段,,根據(jù)PL/SQL語言兼有過程式語句和SQL語句的特點(diǎn),,采取分而治之策略,,把過程語句和SQL語句分開處理。對(duì)于SQL語句,,編譯器首先建立SQL語句結(jié)點(diǎn),,進(jìn)行相應(yīng)的變量綁定和語法檢查;檢查無誤后產(chǎn)生語法樹形式的中間代碼,。對(duì)于過程語句,,編譯器將對(duì)語句成分進(jìn)行語法分析,對(duì)聲明的變量和數(shù)據(jù)類型建立相應(yīng)的符號(hào)表,,最終產(chǎn)生語法樹形式的中間代碼,。解釋器的作用是對(duì)編譯器生成的中間代碼進(jìn)行解釋執(zhí)行。解釋器與編譯器對(duì)應(yīng),,具有相對(duì)獨(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)對(duì)過程式語句,、SQL語句與游標(biāo)、存儲(chǔ)子程序及包的編譯和解釋執(zhí)行,。
2 觸發(fā)器實(shí)現(xiàn)的關(guān)鍵問題
觸發(fā)器定義了當(dāng)某些數(shù)據(jù)庫相關(guān)事件發(fā)生時(shí)數(shù)據(jù)庫應(yīng)采取的動(dòng)作,。觸發(fā)器可增強(qiáng)引用完整性,加強(qiáng)復(fù)雜業(yè)務(wù)的規(guī)則,,或者監(jiān)控?cái)?shù)據(jù)庫的變動(dòng),,其實(shí)現(xiàn)主要涉及到觸發(fā)事件的檢測(cè)以及觸發(fā)條件的判決等關(guān)鍵技術(shù)問題。
2.1 觸發(fā)器的事件檢測(cè)機(jī)制
觸發(fā)器事件檢測(cè)機(jī)制包括對(duì)事件的檢測(cè)和存儲(chǔ),,是實(shí)現(xiàn)觸發(fā)器的關(guān)鍵,。觸發(fā)器檢測(cè)的事件類型比較簡(jiǎn)單,基本事件主要包括對(duì)數(shù)據(jù)的插入,、刪除以及更新等,。GKD-Base的觸發(fā)器在對(duì)事件檢測(cè)時(shí),直接在相關(guān)事件發(fā)生的前后調(diào)用檢測(cè)函數(shù)截獲并分析事件消息,,以確定是否對(duì)觸發(fā)器點(diǎn)火,。
觸發(fā)器事件檢測(cè)機(jī)制實(shí)現(xiàn)的關(guān)鍵在于對(duì)觸發(fā)事件的存儲(chǔ)。觸發(fā)事件具有時(shí)間順序,,因此存儲(chǔ)時(shí)也必須按照嚴(yán)格的時(shí)間順序進(jìn)行存儲(chǔ),。綜合比較各個(gè)商用和實(shí)驗(yàn)數(shù)據(jù)庫系統(tǒng)的事件表存儲(chǔ)機(jī)制,,選擇了Starburst的雙" title="的雙">的雙HASH鏈表存儲(chǔ)機(jī)制,如圖1,。
這里,,變遷表分為兩種類型:NEW和OLD,分別對(duì)應(yīng)于觸發(fā)器行級(jí)別操作中的NEW值和OLD值,。變遷表中存儲(chǔ)了事件類型,、當(dāng)前數(shù)據(jù)表以及事件作用的元組。系統(tǒng)可以通過這個(gè)駐留內(nèi)存的雙HASH鏈表實(shí)現(xiàn)數(shù)據(jù)庫變遷的快速定位和跟蹤處理,。
2.2 觸發(fā)器的條件判決機(jī)制
觸發(fā)器的條件判決機(jī)制是觸發(fā)器的核心,,根據(jù)SQL99標(biāo)準(zhǔn)的定義,可以將觸發(fā)器分為前觸發(fā),、約束判定和后觸發(fā)三種類型,。這三種類型觸發(fā)器的判決順序策略如圖2。
觸發(fā)器的條件評(píng)估是影響觸發(fā)器機(jī)制的最關(guān)鍵因素,。在數(shù)據(jù)庫環(huán)境中,,大多數(shù)數(shù)據(jù)修改行為只能影響數(shù)據(jù)庫的一小部分內(nèi)容,因此沒必要每次都從頭開始評(píng)估觸發(fā)器規(guī)則條件,,Rete和TREAT網(wǎng)絡(luò)等增量條件評(píng)估方法已經(jīng)被證明是觸發(fā)器條件評(píng)估(Condition Evaluation)的有效處理手段,。
以Rete網(wǎng)絡(luò)為例(圖3),它是一個(gè)左深度二叉樹,,其基本元素包括:
根結(jié)點(diǎn):根結(jié)點(diǎn)接收插入/刪除(+/-)記號(hào)(tokens),,并將其傳遞給每一個(gè)后繼結(jié)點(diǎn);
t-const結(jié)點(diǎn):記號(hào)到達(dá)這些結(jié)點(diǎn)后,,將根據(jù)該結(jié)點(diǎn)上的條件謂詞進(jìn)行判決,,那些通過測(cè)試的記號(hào)將繼續(xù)傳播下去,沒有通過測(cè)試的記號(hào)則被丟棄掉,;
α-存儲(chǔ)結(jié)點(diǎn):通過t-const結(jié)點(diǎn)測(cè)試的記號(hào)將存儲(chǔ)到這個(gè)結(jié)點(diǎn)中,,存儲(chǔ)在α-存儲(chǔ)結(jié)點(diǎn)中的每一個(gè)記號(hào)都將同時(shí)被傳遞給該結(jié)點(diǎn)的后繼結(jié)點(diǎn);
AND(連接)結(jié)點(diǎn):這些結(jié)點(diǎn)有兩個(gè)輸入,,到達(dá)其中任意一個(gè)輸入結(jié)點(diǎn)的記號(hào)都要通過AND結(jié)點(diǎn)進(jìn)行測(cè)試,,看它是否需要與另外一個(gè)輸入進(jìn)行連接操作。如果是,,則連接兩個(gè)輸入的記號(hào)對(duì),,將它們合并成一個(gè)組合記號(hào)后再傳遞給后繼的β-存儲(chǔ)結(jié)點(diǎn);
β-存儲(chǔ)結(jié)點(diǎn):存儲(chǔ)連接結(jié)點(diǎn)的輸出,,并將輸出同時(shí)傳遞給后繼結(jié)點(diǎn),;
P-結(jié)點(diǎn)(規(guī)則結(jié)點(diǎn)):+記號(hào)到達(dá)這里表明應(yīng)該喚醒一個(gè)與該記號(hào)相關(guān)聯(lián)的規(guī)則實(shí)例;-記號(hào)到達(dá)這里表明與其中的標(biāo)簽對(duì)象相關(guān)聯(lián)的已經(jīng)進(jìn)入待執(zhí)行隊(duì)列的規(guī)則實(shí)例應(yīng)該被刪除,。
Rete網(wǎng)絡(luò)只支持兩路連接,,對(duì)于一個(gè)有多個(gè)關(guān)系參與的規(guī)則定義,,不同的連接順序可以得到不同的Rete網(wǎng)絡(luò),根據(jù)數(shù)據(jù)字典信息可以選擇最優(yōu)的執(zhí)行順序,。圖3是對(duì)應(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ā)器的編譯與存儲(chǔ)操作,觸發(fā)器的調(diào)用包括對(duì)觸發(fā)器事件的檢測(cè)和觸發(fā)器動(dòng)作的執(zhí)行,。
3.1創(chuàng)建觸發(fā)器
觸發(fā)器的創(chuàng)建包括觸發(fā)器的編譯和存儲(chǔ)。觸發(fā)器的編譯涉及到觸發(fā)器的命名,、觸發(fā)器事件的正確性檢查,、觸發(fā)器引用表的合法性檢查以及觸發(fā)器主體的語法檢查。觸發(fā)器創(chuàng)建之前首先要檢查用戶是否有創(chuàng)建觸發(fā)器的權(quán)限,,以及觸發(fā)器名是否已經(jīng)在存儲(chǔ)觸發(fā)器的數(shù)據(jù)字典中被使用,。觸發(fā)事件部分在觸發(fā)器創(chuàng)建時(shí)要進(jìn)行檢查,需要檢查的內(nèi)容包括語法檢查,、觸發(fā)器引用的表和列是否存在,,以及用戶是否有針對(duì)這個(gè)表創(chuàng)建觸發(fā)器的權(quán)限。表和列的存在與否可以先調(diào)用GKD-Base的XAPI函數(shù)分析出DML語句中表和列的信息,,然后根據(jù)這些信息檢查數(shù)據(jù)字典,;權(quán)限的檢查也要到數(shù)據(jù)字典中查詢。觸發(fā)器的語法檢查通過調(diào)用PL/SQL引擎的編譯器實(shí)現(xiàn),;PL/SQL引擎編譯器對(duì)觸發(fā)器過程語句塊進(jìn)行編譯,,并生成包含觸發(fā)器所有必要信息的語法樹形式的中間代碼。
保存觸發(fā)器相關(guān)信息的數(shù)據(jù)結(jié)構(gòu)" title="數(shù)據(jù)結(jié)構(gòu)">數(shù)據(jù)結(jié)構(gòu)最終需要保存在數(shù)據(jù)字典中,。因?yàn)橛|發(fā)器使用單獨(dú)的命名空間,,可以設(shè)計(jì)一個(gè)單獨(dú)的系統(tǒng)表作為存儲(chǔ)觸發(fā)器的數(shù)據(jù)字典。數(shù)據(jù)字典應(yīng)該保存觸發(fā)器調(diào)用過程中必須的信息,,類似于Oracle sys.trigger$表,。觸發(fā)器主體是一個(gè)語句塊,對(duì)它可以當(dāng)作一個(gè)存儲(chǔ)過程來處理,,單獨(dú)保存在一個(gè)系統(tǒng)表中,,通過觸發(fā)器主體的ID號(hào)與存儲(chǔ)在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引擎編譯器對(duì)觸發(fā)器語句進(jìn)行編譯,如出現(xiàn)語法或語義錯(cuò)誤,,轉(zhuǎn)(6),;否則轉(zhuǎn)(4)。
(4)將觸發(fā)器信息寫入外存,,然后返回觸發(fā)器標(biāo)識(shí)ID,。
(5)在數(shù)據(jù)庫表結(jié)構(gòu)的系統(tǒng)表中將(4)中所得標(biāo)識(shí)與觸發(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ā)器約束條件的檢查而設(shè)立的。為了在觸發(fā)事件發(fā)生時(shí),,能立即判斷當(dāng)前被處理對(duì)象是否滿足觸發(fā)約束條件,,通過調(diào)用PL/SQL引擎編譯器將外存中存放觸發(fā)器約束源代碼轉(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)如SB不為空,,則轉(zhuǎn)SB鏈觸發(fā)操作算法。
(3)如RB不為空,則轉(zhuǎn)RB鏈觸發(fā)操作算法,。
(4)對(duì)當(dāng)前數(shù)據(jù)對(duì)象進(jìn)行觸發(fā)事件所規(guī)定的DML操作,。
(5)如RA不為空,則轉(zhuǎn)RA鏈觸發(fā)操作算法,。
(6)判斷觸發(fā)事件所作用的數(shù)據(jù)記錄是否都被處理完畢,,如是,轉(zhuǎn)(7),;否則,,取出下一條記錄作為當(dāng)前的數(shù)據(jù)對(duì)象,轉(zhuǎn)(3),。
(7)如SA不為空,,則轉(zhuǎn)SA鏈觸發(fā)操作算法。
(8)釋放所占的資源,,結(jié)束觸發(fā)器調(diào)用的處理,。
對(duì)給定觸發(fā)器鏈操作算法如下:
(1)根據(jù)觸發(fā)器調(diào)用算法檢測(cè),當(dāng)前觸發(fā)器鏈不為空,,取鏈?zhǔn)子|發(fā)器。
(2)將待處理數(shù)據(jù)對(duì)象的相關(guān)信息代入觸發(fā)條件判斷,,
如果條件為真,,轉(zhuǎn)(3);否則轉(zhuǎn)(4),。
(3)啟動(dòng)一個(gè)PL/SQL解釋執(zhí)行器,,對(duì)當(dāng)前觸發(fā)器動(dòng)作鏈中所記錄的動(dòng)作進(jìn)行解釋執(zhí)行。
(4)取鏈中下一個(gè)觸發(fā)器為鏈?zhǔn)?,判斷是否為空,,如是,轉(zhuǎn)(5),;否則轉(zhuǎn)(1),。
(5)完成當(dāng)前觸發(fā)器鏈操作,返回觸發(fā)器調(diào)用算法繼續(xù),。
觸發(fā)器的更新操作是對(duì)一個(gè)觸發(fā)器進(jìn)行編譯后,,替換已存在的作用在同一個(gè)表上的同名觸發(fā)器,基本操作與觸發(fā)器的創(chuàng)建是一致的,;觸發(fā)器的刪除操作步驟主要是在數(shù)據(jù)字典中對(duì)指定的觸發(fā)器進(jìn)行查詢并刪除,。這里不再詳述。
參考文獻(xiàn)
1 唐 揚(yáng),熊 偉,陳宏盛等. GKD-Base PL/SQL引擎實(shí)現(xiàn)關(guān)鍵技術(shù)研究. 電子技術(shù)應(yīng)用, 2004,;30(8)
2 Tom Portfolio. PL/SQL User′s Guide and Reference. Release 8.1.6, Oracle Corporation. 1999
3 J.Widom,,S.Finkelstein. Set Oriented Production Rules in Relational Database Systems. In Proc. ACM SIGMOD, 1990
4 Doorenbos, R. B., Matching 100,000 learned rules. In Proceedings of the Eleventh National Conference on Artificial Intelligence, pages 290~296, 1993
5 C.-L. Forgy. Rete: a Fast Algorithm for the Many Pattern/Many Object Pattern Match Problem. Artificial Intelligence, 1982
6 Miranker, D. P. TREAT: A NEW and Efficient Match Algo-rithm for AI Production Systems. Morgan Kaufmann, San Mateo, CA.