<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 數據庫觸發(fā)器機制的設計與實(shí)現

數據庫觸發(fā)器機制的設計與實(shí)現

——
作者:長(cháng)沙國防科技大學(xué)電子科學(xué)與工程學(xué)院 唐 揚 熊 偉 陳宏盛 景 寧 時(shí)間:2007-02-06 來(lái)源:電子技術(shù)應用 收藏

摘 要:根據當前數據庫應用需求和技術(shù)發(fā)展現狀,研究了數據庫管理系統機制實(shí)現的關(guān)鍵技術(shù)問(wèn)題,并以GKD-Base為原型,在已有的GKD-Base 基礎上實(shí)現了數據庫的功能。
 
關(guān)鍵詞    

數據庫管理系統作為信息系統的核心部件,在信息化時(shí)代所充當的角色是其它任何軟件所不能替代的。當前數據庫應用的一個(gè)普遍要求是數據庫管理系統能夠在一些數據庫相關(guān)事件發(fā)生時(shí)觸發(fā)預先定義的操作,實(shí)現信息管理的自動(dòng)化,因此引進(jìn)了觸發(fā)器機制。觸發(fā)器可以增強引用完整性,加強復雜業(yè)務(wù)的規則,或者監控數據庫的變動(dòng),并執行一定的數據操作。 

觸發(fā)器機制實(shí)現主要涉及觸發(fā)事件的檢測以及觸發(fā)條件的判決等關(guān)鍵技術(shù)問(wèn)題,以及對觸發(fā)器的編譯存儲和調用執行等具體操作。 

本文以國產(chǎn)數據庫管理系統GKD-Base為原型,在兼容Oracle 規范的基礎上,提出一套解決方案,對觸發(fā)器的關(guān)鍵技術(shù)問(wèn)題進(jìn)行了探討,并設計實(shí)現了數據庫的觸發(fā)器機制,擴展了數據庫管理系統GKD-Base的功能。 

1 GKD-Base PL/SQL 引擎 

GKD-BASE數據庫是一個(gè)具有自主知識產(chǎn)權的數據庫管理系統,具有兼容SQL89標準的SQL引擎,能夠為用戶(hù)提供一個(gè)統一、有效的數據庫訪(fǎng)問(wèn)接口(XAPI),實(shí)現對數據庫的各種操作。為了融合SQL語(yǔ)言強大的集合數據處理能力和第三代語(yǔ)言(3GL)靈活的過(guò)程處理能力,在GKD-Base上已初步實(shí)現了兼容Oarcle PL/SQL V.23的PL/SQL引擎。 

GKD-Base PL/SQL引擎包括編譯器、解釋器和異常處理三個(gè)模塊。在編譯階段,根據PL/SQL語(yǔ)言兼有過(guò)程式語(yǔ)句和SQL語(yǔ)句的特點(diǎn),采取分而治之策略,把過(guò)程語(yǔ)句和SQL語(yǔ)句分開(kāi)處理。對于SQL語(yǔ)句,編譯器首先建立SQL語(yǔ)句結點(diǎn),進(jìn)行相應的變量綁定和語(yǔ)法檢查;檢查無(wú)誤后產(chǎn)生語(yǔ)法樹(shù)形式的中間代碼。對于過(guò)程語(yǔ)句,編譯器將對語(yǔ)句成分進(jìn)行語(yǔ)法分析,對聲明的變量和數據類(lèi)型建立相應的符號表,最終產(chǎn)生語(yǔ)法樹(shù)形式的中間代碼。解釋器的作用是對編譯器生成的中間代碼進(jìn)行解釋執行。解釋器與編譯器對應,具有相對獨立的SQL語(yǔ)句解釋模塊和過(guò)程語(yǔ)句解釋模塊。另外,解釋器還包括執行狀態(tài)堆棧的管理、與GKD-Base SQL引擎的調用接口。異常處理模塊主要實(shí)現程序運行時(shí)的錯誤檢查和報告,并支持用戶(hù)自定義異常和預定義異常的檢查和處理。 

GKD-Base PL/SQL引擎可以實(shí)現對過(guò)程式語(yǔ)句、SQL語(yǔ)句與游標、存儲子程序及包的編譯和解釋執行。 

2 觸發(fā)器實(shí)現的關(guān)鍵問(wèn)題 

觸發(fā)器定義了當某些數據庫相關(guān)事件發(fā)生時(shí)數據庫應采取的動(dòng)作。觸發(fā)器可增強引用完整性,加強復雜業(yè)務(wù)的規則,或者監控數據庫的變動(dòng),其實(shí)現主要涉及到觸發(fā)事件的檢測以及觸發(fā)條件的判決等關(guān)鍵技術(shù)問(wèn)題。 

2.1 觸發(fā)器的事件檢測機制 

觸發(fā)器事件檢測機制包括對事件的檢測和存儲,是實(shí)現觸發(fā)器的關(guān)鍵。觸發(fā)器檢測的事件類(lèi)型比較簡(jiǎn)單,基本事件主要包括對數據的插入、刪除以及更新等。GKD-Base的觸發(fā)器在對事件檢測時(shí),直接在相關(guān)事件發(fā)生的前后調用檢測函數截獲并分析事件消息,以確定是否對觸發(fā)器點(diǎn)火。 

觸發(fā)器事件檢測機制實(shí)現的關(guān)鍵在于對觸發(fā)事件的存儲。觸發(fā)事件具有時(shí)間順序,因此存儲時(shí)也必須按照嚴格的時(shí)間順序進(jìn)行存儲。綜合比較各個(gè)商用和實(shí)驗數據庫系統的事件表存儲機制,選擇了Starburst的雙HASH鏈表存儲機制,如圖1。

圖1 Starburst中變遷表的

這里,變遷表分為兩種類(lèi)型:NEW和OLD,分別對應于觸發(fā)器行級別操作中的NEW值和OLD值。變遷表中存儲了事件類(lèi)型、當前數據表以及事件作用的元組。系統可以通過(guò)這個(gè)駐留內存的雙HASH鏈表實(shí)現數據庫變遷的快速定位和跟蹤處理。 

2.2 觸發(fā)器的條件判決機制 

觸發(fā)器的條件判決機制是觸發(fā)器的核心,根據SQL99標準的定義,可以將觸發(fā)器分為前觸發(fā)、約束判定和后觸發(fā)三種類(lèi)型。這三種類(lèi)型觸發(fā)器的判決順序策略如圖2。

圖 2 三種類(lèi)型觸發(fā)器的判決順序策略圖

圖 3 示意圖

觸發(fā)器的條件評估是影響觸發(fā)器機制的最關(guān)鍵因素。在數據庫環(huán)境中,大多數數據修改行為只能影響數據庫的一小部分內容,因此沒(méi)必要每次都從頭開(kāi)始評估觸發(fā)器規則條件,Rete和TREAT等增量條件評估方法已經(jīng)被證明是觸發(fā)器條件評估(Condition Evaluation)的有效處理手段。 

為例(圖3),它是一個(gè)左深度二叉樹(shù),其基本元素包括: 
根結點(diǎn):根結點(diǎn)接收插入/刪除(+/-)記號(tokens),并將其傳遞給每一個(gè)后繼結點(diǎn); 
t-const結點(diǎn):記號到達這些結點(diǎn)后,將根據該結點(diǎn)上的條件謂詞進(jìn)行判決,那些通過(guò)測試的記號將繼續傳播下去,沒(méi)有通過(guò)測試的記號則被丟棄掉; 
α-存儲結點(diǎn):通過(guò)t-const結點(diǎn)測試的記號將存儲到這個(gè)結點(diǎn)中,存儲在α-存儲結點(diǎn)中的每一個(gè)記號都將同時(shí)被傳遞給該結點(diǎn)的后繼結點(diǎn); 
AND(連接)結點(diǎn):這些結點(diǎn)有兩個(gè)輸入,到達其中任意一個(gè)輸入結點(diǎn)的記號都要通過(guò)AND結點(diǎn)進(jìn)行測試,看它是否需要與另外一個(gè)輸入進(jìn)行連接操作。如果是,則連接兩個(gè)輸入的記號對,將它們合并成一個(gè)組合記號后再傳遞給后繼的β-存儲結點(diǎn); 
β-存儲結點(diǎn):存儲連接結點(diǎn)的輸出,并將輸出同時(shí)傳遞給后繼結點(diǎn); 
P-結點(diǎn)(規則結點(diǎn)):+記號到達這里表明應該喚醒一個(gè)與該記號相關(guān)聯(lián)的規則實(shí)例;-記號到達這里表明與其中的標簽對象相關(guān)聯(lián)的已經(jīng)進(jìn)入待執行隊列的規則實(shí)例應該被刪除。 

Rete網(wǎng)絡(luò )只支持兩路連接,對于一個(gè)有多個(gè)關(guān)系參與的規則定義,不同的連接順序可以得到不同的Rete網(wǎng)絡(luò ),根據數據字典信息可以選擇最優(yōu)的執行順序。圖3是對應于規則條件“A.color =“BULE”AND A.x < B.x AND B.x < C.x”的Rete網(wǎng)絡(luò )示意圖。 

3 觸發(fā)器實(shí)現算法 

觸發(fā)器的具體實(shí)現可以分為觸發(fā)器創(chuàng )建和調用,此外還包括觸發(fā)器的修改、刪除等操作。其中觸發(fā)器的創(chuàng )建包括觸發(fā)器的編譯與存儲操作,觸發(fā)器的調用包括對觸發(fā)器事件的檢測和觸發(fā)器動(dòng)作的執行。 

3.1創(chuàng )建觸發(fā)器 

觸發(fā)器的創(chuàng )建包括觸發(fā)器的編譯和存儲。觸發(fā)器的編譯涉及到觸發(fā)器的命名、觸發(fā)器事件的正確性檢查、觸發(fā)器引用表的合法性檢查以及觸發(fā)器主體的語(yǔ)法檢查。觸發(fā)器創(chuàng )建之前首先要檢查用戶(hù)是否有創(chuàng )建觸發(fā)器的權限,以及觸發(fā)器名是否已經(jīng)在存儲觸發(fā)器的數據字典中被使用。觸發(fā)事件部分在觸發(fā)器創(chuàng )建時(shí)要進(jìn)行檢查,需要檢查的內容包括語(yǔ)法檢查、觸發(fā)器引用的表和列是否存在,以及用戶(hù)是否有針對這個(gè)表創(chuàng )建觸發(fā)器的權限。表和列的存在與否可以先調用GKD-Base的XAPI函數分析出DML語(yǔ)句中表和列的信息,然后根據這些信息檢查數據字典;權限的檢查也要到數據字典中查詢(xún)。觸發(fā)器的語(yǔ)法檢查通過(guò)調用PL/SQL引擎的編譯器實(shí)現;PL/SQL引擎編譯器對觸發(fā)器過(guò)程語(yǔ)句塊進(jìn)行編譯,并生成包含觸發(fā)器所有必要信息的語(yǔ)法樹(shù)形式的中間代碼。 

保存觸發(fā)器相關(guān)信息的數據結構最終需要保存在數據字典中。因為觸發(fā)器使用單獨的命名空間,可以設計一個(gè)單獨的系統表作為存儲觸發(fā)器的數據字典。數據字典應該保存觸發(fā)器調用過(guò)程中必須的信息,類(lèi)似于Oracle sys.trigger$表。觸發(fā)器主體是一個(gè)語(yǔ)句塊,對它可以當作一個(gè)存儲過(guò)程來(lái)處理,單獨保存在一個(gè)系統表中,通過(guò)觸發(fā)器主體的ID號與存儲在USER_TRIGGERS表中的其它觸發(fā)器信息相關(guān)聯(lián)。在觸發(fā)器調用過(guò)程中,根據觸發(fā)器中的ID來(lái)調用。 

創(chuàng )建觸發(fā)器算法如下: 
(1)合法性驗證。如當前用戶(hù)無(wú)權執行該操作,或者用戶(hù)給出的表不存在,轉(6);否則轉(2)。 
(2)存在性檢查。如當前定義的觸發(fā)器與當前表以往定義的觸發(fā)器重名或同類(lèi)型,轉(6);否則轉(3)。 
(3)語(yǔ)法檢查。調用PL/SQL引擎編譯器對觸發(fā)器語(yǔ)句進(jìn)行編譯,如出現語(yǔ)法或語(yǔ)義錯誤,轉(6);否則轉(4)。 
(4)將觸發(fā)器信息寫(xiě)入外存,然后返回觸發(fā)器標識ID。 
(5)在數據庫表結構的系統表中將(4)中所得標識與觸發(fā)器名填入其中,然后將觸發(fā)器定義的表項插入到USER_TRIGGERS相應的系統表項中,轉(7)。 
(6)釋放所占資源,報錯退出。 
(7)釋放資源,正常退出。
 
3.2 觸發(fā)器的調用 

觸發(fā)器的調用首先要從外存中讀取觸發(fā)器的信息,并寫(xiě)入內存相應的數據結構中。觸發(fā)器的內存形式是為了更方便地進(jìn)行觸發(fā)器約束條件的檢查而設立的。為了在觸發(fā)事件發(fā)生時(shí),能立即判斷當前被處理對象是否滿(mǎn)足觸發(fā)約束條件,通過(guò)調用PL/SQL引擎編譯器將外存中存放觸發(fā)器約束源代碼轉換為其內存表示,存放在相應觸發(fā)器的內存結構中。 

在觸發(fā)器被調用前,系統將被同一觸發(fā)事件所觸發(fā)的所有活躍的觸發(fā)器組織成四條鏈,如圖4。

圖4 觸發(fā)器鏈示意圖 

根據這個(gè)數據結構,觸發(fā)器調用算法如下: 
(1)將與觸發(fā)事件相關(guān)的觸發(fā)器按類(lèi)型分別記入SB、SA、RB和RA四條鏈中;如沒(méi)有某種類(lèi)型的觸發(fā)器,則相應鏈置空。 
(2)如SB不為空,則轉SB鏈觸發(fā)操作算法。 
(3)如RB不為空,則轉RB鏈觸發(fā)操作算法。 
(4)對當前數據對象進(jìn)行觸發(fā)事件所規定的DML操作。 
(5)如RA不為空,則轉RA鏈觸發(fā)操作算法。 
(6)判斷觸發(fā)事件所作用的數據記錄是否都被處理完畢,如是,轉(7);否則,取出下一條記錄作為當前的數據對象,轉(3)。 
(7)如SA不為空,則轉SA鏈觸發(fā)操作算法。 
(8)釋放所占的資源,結束觸發(fā)器調用的處理。
 
對給定觸發(fā)器鏈操作算法如下: 
(1)根據觸發(fā)器調用算法檢測,當前觸發(fā)器鏈不為空,取鏈首觸發(fā)器。 
(2)將待處理數據對象的相關(guān)信息代入觸發(fā)條件判斷,如果條件為真,轉(3);否則轉(4)。 
(3)啟動(dòng)一個(gè)PL/SQL解釋執行器,對當前觸發(fā)器動(dòng)作鏈中所記錄的動(dòng)作進(jìn)行解釋執行。 
(4)取鏈中下一個(gè)觸發(fā)器為鏈首,判斷是否為空,如是,轉(5);否則轉(1)。 
(5)完成當前觸發(fā)器鏈操作,返回觸發(fā)器調用算法繼續。
 
觸發(fā)器的更新操作是對一個(gè)觸發(fā)器進(jìn)行編譯后,替換已存在的作用在同一個(gè)表上的同名觸發(fā)器,基本操作與觸發(fā)器的創(chuàng )建是一致的;觸發(fā)器的刪除操作步驟主要是在數據字典中對指定的觸發(fā)器進(jìn)行查詢(xún)并刪除。這里不再詳述。
 
參考文獻 
1 唐 揚,熊 偉,陳宏盛等. GKD-Base PL/SQL引擎實(shí)現關(guān)鍵技術(shù)研究. 電子技術(shù)應用, 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 Pro-ceedings 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.   



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>