GKD-Base中Instead-Of觸發(fā)器實(shí)現(xiàn)的關(guān)鍵技術(shù)_第1頁(yè)
GKD-Base中Instead-Of觸發(fā)器實(shí)現(xiàn)的關(guān)鍵技術(shù)_第2頁(yè)
GKD-Base中Instead-Of觸發(fā)器實(shí)現(xiàn)的關(guān)鍵技術(shù)_第3頁(yè)
GKD-Base中Instead-Of觸發(fā)器實(shí)現(xiàn)的關(guān)鍵技術(shù)_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

1、    GKD-Base中Instead-Of觸發(fā)器實(shí)現(xiàn)的關(guān)鍵技術(shù)        陳 浩, 廖 巍, 陳宏盛, 時(shí)間:2008年07月24日     字 體: 大 中 小        關(guān)鍵詞:        摘要:關(guān)鍵詞: PL/SQL引擎 Instead-Of觸發(fā)器GKD-B

2、ase是一個(gè)具有自主知識(shí)產(chǎn)權(quán)的數(shù)據(jù)庫(kù)管理系統(tǒng),經(jīng)過(guò)十幾年的發(fā)展和應(yīng)用,該系統(tǒng)已經(jīng)被證明是穩(wěn)定可靠的。但是,隨著應(yīng)用需求向深度和廣度的發(fā)展,GKD-Base在很多方面都暴露出了不足,如不支持過(guò)程式SQL語(yǔ)言、不支持存儲(chǔ)過(guò)程和函數(shù)、缺少觸發(fā)器功能等,這都為GKD-Base數(shù)據(jù)庫(kù)管理系統(tǒng)的進(jìn)一步推廣應(yīng)用帶來(lái)了不小的障礙。為此筆者開(kāi)發(fā)了GKD-Base PL/SQL引擎,其兼容Oracle PL/SQLV2.3規(guī)范。進(jìn)而在引擎的基礎(chǔ)上實(shí)現(xiàn)了GKD-Base DML觸發(fā)器功能12、SQL Server3、PostgreSQL4等都提供了所謂的Instead-Of視圖觸發(fā)器來(lái)支持視圖更新。定義有Inste

3、ad-Of觸發(fā)器的視圖被DML語(yǔ)句操作時(shí),相應(yīng)的DML語(yǔ)句不執(zhí)行,而觸發(fā)器體被執(zhí)行,于是用戶可以按照自己定義的語(yǔ)義修改定義視圖的基本表,以達(dá)到修改視圖的目的。因此,為了使GKD-Base適應(yīng)應(yīng)用需求的發(fā)展,在GKD-Base PL/SQL引擎的基礎(chǔ)上實(shí)現(xiàn)了GKD-Base Instead-Of視圖觸發(fā)器功能1。1 視圖更新歧義問(wèn)題 視圖是虛擬的關(guān)系,數(shù)據(jù)庫(kù)系統(tǒng)中只存儲(chǔ)它的定義,不存儲(chǔ)元組數(shù)據(jù)。一個(gè)視圖可以看成一個(gè)臨時(shí)關(guān)系,視圖是產(chǎn)生這種臨時(shí)關(guān)系的查詢定義5。由于視圖是虛擬的關(guān)系,對(duì)視圖的更新操作必須映射到對(duì)相應(yīng)的基本表操作才能實(shí)現(xiàn)。完成視圖更新后的數(shù)據(jù)庫(kù)狀態(tài)由視圖定義導(dǎo)出一個(gè)新的視圖狀態(tài),新的

4、視圖狀態(tài)對(duì)應(yīng)由原視圖狀態(tài)直接完成視圖的更新操作。如圖1所示,u是關(guān)系數(shù)據(jù)庫(kù)DB的視圖v(DB)的更新操作,T(u)是對(duì)視圖更新操作的變換,它作用到DB上產(chǎn)生新的數(shù)據(jù)庫(kù)狀態(tài)DB、新的視圖狀態(tài)v(DB)。正確的視圖更新操作使得u(v(DB) v(DB)。但是對(duì)視圖更新操作的變換T(u)并不總存在6。即使存在,也不總是惟一的。視圖的更新存在固有的歧義性,僅有上面的語(yǔ)義是不夠的。并且,由于視圖本身的歧義性和語(yǔ)義不完整性7,無(wú)法對(duì)于有著集合操作符(如:UNION、MINUS等)、聚集函數(shù)(如:SUM、AVE等)和GROUP BY子句的視圖更新提供支持。2 Instead-Of觸發(fā)器設(shè)計(jì)實(shí)現(xiàn)2.1 PL/

5、SQL引擎體系結(jié)構(gòu)8。2.2 Instead-Of觸發(fā)器設(shè)計(jì)GKD-Base DML觸發(fā)器采用傳統(tǒng)的ECA(Event-Condition-Action,事件條件動(dòng)作)規(guī)則設(shè)計(jì)。與之類似的Instead-Of 視圖觸發(fā)器也采用了ECA規(guī)則。為了適應(yīng)觸發(fā)器的具體情況,在GKD-Base中,Instead-Of 視圖觸發(fā)器擴(kuò)展為一個(gè)四元組模型:Trigger:= 。其中:E(Event):激發(fā)Instead-Of 視圖觸發(fā)器的事件。這里主要是指操作視圖的DML事件,包括Insert、 Delete和Update等。C(Condition):定義觸發(fā)器時(shí)指定的條件。是一個(gè)一元謂詞表達(dá)式。A(Acti

6、on):當(dāng)Event發(fā)生,并且Condition為真時(shí),觸發(fā)的動(dòng)作。S(Status):觸發(fā)器有活躍和休眠兩種狀態(tài),觸發(fā)器處于活躍狀態(tài)時(shí),才可被激發(fā)。觸發(fā)器實(shí)現(xiàn)框架如圖2所示。觸發(fā)器類別判決器是在系統(tǒng)執(zhí)行SQL語(yǔ)句之前,對(duì)SQL語(yǔ)句的操作對(duì)象進(jìn)行判斷,如果是對(duì)基本表操作,則啟動(dòng)DML觸發(fā)器的監(jiān)測(cè)功能;如果是對(duì)視圖進(jìn)行操作,則啟動(dòng)Instead-Of 視圖觸發(fā)器的監(jiān)測(cè)功能。事件監(jiān)視器是在有關(guān)的系統(tǒng)行為發(fā)生時(shí),為各種預(yù)定的事件給觸發(fā)器調(diào)度器發(fā)送信號(hào)。觸發(fā)器調(diào)度器接收事件監(jiān)視器的信號(hào),從數(shù)據(jù)字典中獲取該事件點(diǎn)火的所有觸發(fā)器,并且按照特定的順序排序,調(diào)用條件評(píng)價(jià)器檢查各觸發(fā)器的觸發(fā)條件是否滿足,若滿足

7、則由觸發(fā)器調(diào)度器通知PL/SQL引擎解釋執(zhí)行該觸發(fā)器的動(dòng)作代碼。條件評(píng)價(jià)器是用來(lái)檢查觸發(fā)條件是否滿足的部件。對(duì)于語(yǔ)句級(jí)觸發(fā)器,由于不存在觸發(fā)條件子句,所以觸發(fā)條件始終為真。對(duì)于行(元組)級(jí)觸發(fā)器,條件評(píng)價(jià)器可以將其觸發(fā)條件WHEN子句轉(zhuǎn)換成一個(gè)PL/SQL語(yǔ)言的IF語(yǔ)句,然后由PL/SQL引擎實(shí)現(xiàn)觸發(fā)器條件的計(jì)算。2.3 Instead-Of觸發(fā)器實(shí)現(xiàn)觸發(fā)器謂詞是指觸發(fā)器內(nèi)部用來(lái)標(biāo)識(shí)激發(fā)觸發(fā)器動(dòng)作的DML語(yǔ)句的布爾變量,為:INSERTING、UPDATING、DELETING。其分別對(duì)應(yīng)于PL/SQL程序中的三個(gè)布爾變量,它們?cè)诰幾g觸發(fā)器時(shí)被加載到符號(hào)表中,在調(diào)用PL/SQL引擎執(zhí)行觸發(fā)器動(dòng)

8、作體之前,它們的值被準(zhǔn)備好,供PL/SQL引擎取用。NEW和OLD元組作為PL/SQL程序中的記錄樣式加載到符號(hào)表中,被編譯器引用。其記錄域與新舊元組對(duì)應(yīng)的表的各個(gè)屬性一一對(duì)應(yīng)。在調(diào)用PL/SQL引擎執(zhí)行觸發(fā)器動(dòng)作體之前,必須準(zhǔn)備好NEW和OLD的值。但NEW和OLD元組是偽記錄類型,不能完全按照記錄的語(yǔ)法來(lái)訪問(wèn)12。這一點(diǎn)必須在編譯時(shí)加入新的語(yǔ)義規(guī)則。功能:編譯觸發(fā)器定義語(yǔ)句后,將觸發(fā)器信息存儲(chǔ)于數(shù)據(jù)字典中。輸入:一條用戶輸入的觸發(fā)器定義語(yǔ)句。輸出:觸發(fā)器數(shù)據(jù)字典的元組。(1)判斷當(dāng)前事務(wù)是否存在,如果存在,則提交當(dāng)前事務(wù),并開(kāi)始一個(gè)新事務(wù);否則,直接開(kāi)始一個(gè)新事務(wù)。(2)用戶權(quán)限檢查。如果

9、當(dāng)前用戶無(wú)權(quán)執(zhí)行該操作,轉(zhuǎn)(12);否則轉(zhuǎn)(3)。(3)檢查觸發(fā)表(視圖)名及觸發(fā)事件所涉及的屬性是否存在。在GKD-Base的數(shù)據(jù)字典SYS.TABLES中查找,如果觸發(fā)表或某個(gè)屬性不存在,轉(zhuǎn)(12);否則,轉(zhuǎn)(4)。(4)觸發(fā)器名存在性檢查。如果當(dāng)前定義的觸發(fā)器與以往定義的某個(gè)觸發(fā)器重名,轉(zhuǎn)(5);否則轉(zhuǎn)(7)。(5)如果聲明語(yǔ)句中沒(méi)有包含 OR REPLACE選項(xiàng),轉(zhuǎn)(12);否則,轉(zhuǎn)(6)。(6)如果觸發(fā)表(視圖)不一致,轉(zhuǎn)(12);否則轉(zhuǎn)(7)(觸發(fā)表指定義了DML觸發(fā)器或Instead-Of 視圖觸發(fā)器的基本表或視圖)。(7)檢查定義觸發(fā)器的合法性,DML觸發(fā)器只能定義在基本表上,

10、而Instead-Of視圖觸發(fā)器只能定義在視圖上。檢查合法,轉(zhuǎn)(8),否則轉(zhuǎn)(12)。(8)調(diào)用PL/SQL引擎編譯觸發(fā)器動(dòng)作體,并且將觸發(fā)器的WHEN條件子句轉(zhuǎn)換成一個(gè)IF語(yǔ)句,這個(gè)IF語(yǔ)句的真值部分包括了觸發(fā)器動(dòng)作體。如果觸發(fā)器動(dòng)作體中出現(xiàn)語(yǔ)法或語(yǔ)義錯(cuò)誤,轉(zhuǎn)(12);否則轉(zhuǎn)(9)。(9)在數(shù)據(jù)字典SYS.TRIGGERS表中插入一個(gè)新元組,填入此觸發(fā)器的信息。如果出現(xiàn)磁盤(pán)I/O錯(cuò)誤,轉(zhuǎn)(12);否則轉(zhuǎn)(10)。(10)釋放所占資源。(11)提交當(dāng)前事務(wù),正常結(jié)束。(12)回滾當(dāng)前事務(wù),報(bào)錯(cuò)退出。與DML觸發(fā)器不同,Instead-Of 視圖觸發(fā)器在激發(fā)時(shí),不必考慮各種觸發(fā)器(如語(yǔ)句級(jí)前觸發(fā)

11、器和行級(jí)后觸發(fā)器)之間的相互纏結(jié)。其點(diǎn)火算法也相對(duì)簡(jiǎn)單。 在觸發(fā)事件當(dāng)前的事務(wù)中構(gòu)造一條SQL查詢語(yǔ)句,從觸發(fā)器數(shù)據(jù)字典表中獲取與該觸發(fā)事件相關(guān)的處于活躍狀態(tài)的Instead-Of視圖觸發(fā)器元組。如果查詢結(jié)果不為空,將觸發(fā)器條件轉(zhuǎn)換成一個(gè)PL/SQL語(yǔ)言的IF語(yǔ)句,并將觸發(fā)事件當(dāng)前所用到的元組值(新值和舊值)準(zhǔn)備好,啟動(dòng)PL/SQL引擎,對(duì)觸發(fā)器動(dòng)作體的源代碼進(jìn)行解釋執(zhí)行。釋放所占的資源,結(jié)束觸發(fā)器調(diào)用。3 系統(tǒng)應(yīng)用實(shí)例3.1實(shí)驗(yàn)數(shù)據(jù)Rooms表如表1所示,Classes表如表2所示。在Classes表和Rooms表中Room_ID相等的連接條件上創(chuàng)建一個(gè)名為Classes_rooms的視圖,

12、進(jìn)行連接運(yùn)算。Classes_rooms視圖如表3所示。定義關(guān)于Classes_rooms 的Update語(yǔ)義:通過(guò)對(duì)Classes_rooms的Update操作,實(shí)現(xiàn)對(duì)一個(gè)班級(jí)某門課程占用教室的調(diào)整。通過(guò)Instead-Of觸發(fā)器實(shí)現(xiàn):如果修改了Classes_rooms的Dept和Course屬性,那么就修改Classes基本表的相應(yīng)屬性,如果修改了Classes_rooms的Building和Room_Num屬性,那么就修改Rooms基本表的相應(yīng)屬性。再適當(dāng)調(diào)整兩個(gè)基本表的Room_ID。3.2 實(shí)驗(yàn)結(jié)果執(zhí)行UPDATE classes_rooms SET Dept=NUT, course = 307 WHERE building=Buidling 7 AND room_num = 201; 查詢更新后的視圖,觀察Instead-Of觸發(fā)器對(duì)視圖的作用。表4、表5、表6演示了本實(shí)驗(yàn)的結(jié)果。由結(jié)果可知,通過(guò)Instead-Of觸發(fā)器,成功地對(duì)Classes_rooms視圖進(jìn)行了修改,將歷史系101課的教室調(diào)整給了營(yíng)養(yǎng)系307課程使用。通過(guò)以上應(yīng)用實(shí)例驗(yàn)證了Instead-Of觸發(fā)器帶給數(shù)據(jù)庫(kù)系統(tǒng)的視圖修改功能。本文參照Oracle PL/SQL V2.3

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論