《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 業界動態 > 數據庫觸發器機制的設計與實現

數據庫觸發器機制的設計與實現

2008-10-16
作者:唐 揚 熊 偉 陳宏盛 景

  摘 要: 根據當前數據庫應用需求和技術發展現狀,研究了數據庫管理系統" title="管理系統">管理系統觸發器機制實現的關鍵技術問題,并以GKD-Base" title="GKD-Base">GKD-Base為原型,在已有的GKD-Base PL/SQL引擎基礎上實現了數據庫的觸發器功能。
  關鍵詞: PL/SQL引擎 Rete網絡 雙Hash結構 觸發器


  數據庫管理系統作為信息系統的核心部件,在信息化時代所充當的角色是其它任何軟件所不能替代的。當前數據庫應用的一個普遍要求是數據庫管理系統能夠在一些數據庫相關事件發生時觸發預先定義的操作,實現信息管理的自動化,因此引進了觸發器機制。觸發器可以增強引用完整性,加強復雜業務的規則,或者監控數據庫的變動,并執行一定的數據操作。
  觸發器機制實現主要涉及觸發事件的檢測以及觸發條件的判決等關鍵技術問題,以及對觸發器的編譯存儲和調用執行等具體操作。
  本文以國產數據庫管理系統GKD-Base為原型,在兼容Oracle 規范的PL/SQL引擎基礎上,提出一套解決方案,對觸發器的關鍵技術問題進行了探討,并設計實現了數據庫的觸發器機制,擴展了數據庫管理系統GKD-Base的功能。
1 GKD-Base PL/SQL 引擎
  GKD-BASE數據庫是一個具有自主知識產權的數據庫管理系統,具有兼容SQL89標準的SQL引擎,能夠為用戶提供一個統一、有效的數據庫訪問接口(XAPI),實現對數據庫的各種操作。為了融合SQL語言強大的集合數據處理能力" title="處理能力">處理能力和第三代語言(3GL)靈活的過程處理能力,在GKD-Base上已初步實現了兼容Oarcle PL/SQL V.23的PL/SQL引擎。
  GKD-Base PL/SQL引擎包括編譯器、解釋器和異常處理三個模塊。在編譯階段,根據PL/SQL語言兼有過程式語句和SQL語句的特點,采取分而治之策略,把過程語句和SQL語句分開處理。對于SQL語句,編譯器首先建立SQL語句結點,進行相應的變量綁定和語法檢查;檢查無誤后產生語法樹形式的中間代碼。對于過程語句,編譯器將對語句成分進行語法分析,對聲明的變量和數據類型建立相應的符號表,最終產生語法樹形式的中間代碼。解釋器的作用是對編譯器生成的中間代碼進行解釋執行。解釋器與編譯器對應,具有相對獨立的SQL語句解釋模塊和過程語句解釋模塊。另外,解釋器還包括執行狀態堆棧的管理、與GKD-Base SQL引擎的調用接口。異常處理模塊主要實現程序運行時的錯誤檢查和報告,并支持用戶自定義異常和預定義異常的檢查和處理。
  GKD-Base PL/SQL引擎可以實現對過程式語句、SQL語句與游標、存儲子程序及包的編譯和解釋執行。
2 觸發器實現的關鍵問題
  觸發器定義了當某些數據庫相關事件發生時數據庫應采取的動作。觸發器可增強引用完整性,加強復雜業務的規則,或者監控數據庫的變動,其實現主要涉及到觸發事件的檢測以及觸發條件的判決等關鍵技術問題。
2.1 觸發器的事件檢測機制
  觸發器事件檢測機制包括對事件的檢測和存儲,是實現觸發器的關鍵。觸發器檢測的事件類型比較簡單,基本事件主要包括對數據的插入、刪除以及更新等。GKD-Base的觸發器在對事件檢測時,直接在相關事件發生的前后調用檢測函數截獲并分析事件消息,以確定是否對觸發器點火。
  觸發器事件檢測機制實現的關鍵在于對觸發事件的存儲。觸發事件具有時間順序,因此存儲時也必須按照嚴格的時間順序進行存儲。綜合比較各個商用和實驗數據庫系統的事件表存儲機制,選擇了Starburst的雙" title="的雙">的雙HASH鏈表存儲機制,如圖1。


  這里,變遷表分為兩種類型:NEW和OLD,分別對應于觸發器行級別操作中的NEW值和OLD值。變遷表中存儲了事件類型、當前數據表以及事件作用的元組。系統可以通過這個駐留內存的雙HASH鏈表實現數據庫變遷的快速定位和跟蹤處理。
2.2 觸發器的條件判決機制
  觸發器的條件判決機制是觸發器的核心,根據SQL99標準的定義,可以將觸發器分為前觸發、約束判定和后觸發三種類型。這三種類型觸發器的判決順序策略如圖2。


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


  以Rete網絡為例(圖3),它是一個左深度二叉樹,其基本元素包括:
  根結點:根結點接收插入/刪除(+/-)記號(tokens),并將其傳遞給每一個后繼結點;
  t-const結點:記號到達這些結點后,將根據該結點上的條件謂詞進行判決,那些通過測試的記號將繼續傳播下去,沒有通過測試的記號則被丟棄掉;
  α-存儲結點:通過t-const結點測試的記號將存儲到這個結點中,存儲在α-存儲結點中的每一個記號都將同時被傳遞給該結點的后繼結點;
  AND(連接)結點:這些結點有兩個輸入,到達其中任意一個輸入結點的記號都要通過AND結點進行測試,看它是否需要與另外一個輸入進行連接操作。如果是,則連接兩個輸入的記號對,將它們合并成一個組合記號后再傳遞給后繼的β-存儲結點;
  β-存儲結點:存儲連接結點的輸出,并將輸出同時傳遞給后繼結點;
  P-結點(規則結點):+記號到達這里表明應該喚醒一個與該記號相關聯的規則實例;-記號到達這里表明與其中的標簽對象相關聯的已經進入待執行隊列的規則實例應該被刪除。
  Rete網絡只支持兩路連接,對于一個有多個關系參與的規則定義,不同的連接順序可以得到不同的Rete網絡,根據數據字典信息可以選擇最優的執行順序。圖3是對應于規則條件“A.color =“BULE”AND A.x < B.x AND B.x < C.x”的Rete網絡示意圖。
3 觸發器實現算法
  觸發器的具體實現可以分為觸發器創建和調用,此外還包括觸發器的修改、刪除等操作。其中觸發器的創建包括觸發器的編譯與存儲操作,觸發器的調用包括對觸發器事件的檢測和觸發器動作的執行。
3.1創建觸發器
  觸發器的創建包括觸發器的編譯和存儲。觸發器的編譯涉及到觸發器的命名、觸發器事件的正確性檢查、觸發器引用表的合法性檢查以及觸發器主體的語法檢查。觸發器創建之前首先要檢查用戶是否有創建觸發器的權限,以及觸發器名是否已經在存儲觸發器的數據字典中被使用。觸發事件部分在觸發器創建時要進行檢查,需要檢查的內容包括語法檢查、觸發器引用的表和列是否存在,以及用戶是否有針對這個表創建觸發器的權限。表和列的存在與否可以先調用GKD-Base的XAPI函數分析出DML語句中表和列的信息,然后根據這些信息檢查數據字典;權限的檢查也要到數據字典中查詢。觸發器的語法檢查通過調用PL/SQL引擎的編譯器實現;PL/SQL引擎編譯器對觸發器過程語句塊進行編譯,并生成包含觸發器所有必要信息的語法樹形式的中間代碼。
  保存觸發器相關信息的數據結構" title="數據結構">數據結構最終需要保存在數據字典中。因為觸發器使用單獨的命名空間,可以設計一個單獨的系統表作為存儲觸發器的數據字典。數據字典應該保存觸發器調用過程中必須的信息,類似于Oracle sys.trigger$表。觸發器主體是一個語句塊,對它可以當作一個存儲過程來處理,單獨保存在一個系統表中,通過觸發器主體的ID號與存儲在USER_TRIGGERS表中的其它觸發器信息相關聯。在觸發器調用過程中,根據觸發器中的ID來調用。
  創建觸發器算法如下:
  (1)合法性驗證。如當前用戶無權執行該操作,或者用戶給出的表不存在,轉(6);否則轉(2)。
  (2)存在性檢查。如當前定義的觸發器與當前表以往定義的觸發器重名或同類型,轉(6);否則轉(3)。
  (3)語法檢查。調用PL/SQL引擎編譯器對觸發器語句進行編譯,如出現語法或語義錯誤,轉(6);否則轉(4)。
  (4)將觸發器信息寫入外存,然后返回觸發器標識ID。
  (5)在數據庫表結構的系統表中將(4)中所得標識與觸發器名填入其中,然后將觸發器定義的表項插入到USER_TRIGGERS相應的系統表項中,轉(7)。
  (6)釋放所占資源,報錯退出。
  (7)釋放資源,正常退出。
3.2 觸發器的調用
  觸發器的調用首先要從外存中讀取觸發器的信息,并寫入內存相應的數據結構中。觸發器的內存形式是為了更方便地進行觸發器約束條件的檢查而設立的。為了在觸發事件發生時,能立即判斷當前被處理對象是否滿足觸發約束條件,通過調用PL/SQL引擎編譯器將外存中存放觸發器約束源代碼轉換為其內存表示,存放在相應觸發器的內存結構中。
  在觸發器被調用前,系統將被同一觸發事件所觸發的所有活躍的觸發器組織成四條鏈,如圖4。


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

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          99精品久久免费看蜜臀剧情介绍| 香蕉久久精品日日躁夜夜躁| 亚洲福利小视频| 久久久九九九九| 亚洲主播在线播放| 亚洲性色视频| 久久久久高清| 国产精品卡一卡二| 激情欧美一区二区三区| 欧美啪啪成人vr| 国产精品欧美在线| 亚洲视频 欧洲视频| 欧美+日本+国产+在线a∨观看| 红桃视频国产精品| 亚洲大胆人体视频| 一区二区三区**美女毛片| 欧美日韩喷水| 国产精品网站视频| 国产欧美日韩综合一区在线观看| 久久精品视频99| 欧美日韩精品一区二区天天拍小说| 国产日本欧美在线观看| 国内精品视频在线播放| 国产精品二区在线观看| 日韩午夜在线观看视频| 国产主播喷水一区二区| 国产色综合网| 亚洲欧洲精品一区二区精品久久久| 欧美成va人片在线观看| 99香蕉国产精品偷在线观看| 狠狠色综合色综合网络| 国产亚洲a∨片在线观看| 欧美在线免费观看| 亚洲精品系列| 欧美一区二区三区四区视频| 国产在线欧美日韩| 国产精品盗摄一区二区三区| 欧美日韩在线播放一区二区| 欧美啪啪成人vr| 久久成人精品电影| 欧美日韩一区二区在线播放| 国产精品视频免费一区| 亚洲欧美日韩国产一区二区| 一区国产精品| 久久综合伊人77777| 韩国一区二区三区美女美女秀| 亚洲欧美成aⅴ人在线观看| 欧美一区二区三区男人的天堂| 欧美日韩视频免费播放| 亚洲一区观看| 国产精品一区二区在线观看不卡| 久久精品成人欧美大片古装| 99精品国产99久久久久久福利| 中文高清一区| 亚洲欧美福利一区二区| 欧美日韩免费一区二区三区视频| 国产精品视频在线观看| 麻豆av一区二区三区| 国产精品久久国产精麻豆99网站| 久久综合狠狠综合久久激情| 国产欧美日韩精品一区| 欧美日韩亚洲高清一区二区| 久久精品99无色码中文字幕| 亚洲精选大片| 亚洲精品一区二区三区樱花| 亚洲国产精品尤物yw在线观看| 亚洲午夜电影在线观看| 校园激情久久| 激情一区二区三区| 国产精品户外野外| 亚洲视频你懂的| 久久在线免费观看| 性刺激综合网| 一区二区三区|亚洲午夜| 欧美成人免费在线观看| 欧美一区二视频在线免费观看| 亚洲免费观看在线视频| 久久国产精品久久w女人spa| 欧美日韩一区二区三区四区五区| 夜夜精品视频一区二区| 国产亚洲成av人片在线观看桃| 亚洲色诱最新| 国产精品va在线| 韩国av一区二区三区| 欧美一区二区三区在线播放| 亚洲日本理论电影| 最新日韩中文字幕| 国产精品国产三级欧美二区| 午夜精品一区二区三区四区| 国产精品揄拍一区二区| 国产婷婷97碰碰久久人人蜜臀| 一本色道久久综合亚洲精品高清| av不卡免费看| 9人人澡人人爽人人精品| 欧美久久综合| 精品动漫3d一区二区三区| 亚洲小说区图片区| 欧美一区二区三区免费观看视频| 狠狠色香婷婷久久亚洲精品| 国产精品久久久久一区二区三区| 国产精品免费福利| 久久www成人_看片免费不卡| 一区二区三区四区精品| 国产综合自拍| 亚洲欧美日产图| 国产精品一区二区久久久久| 日韩一级免费| 亚洲婷婷国产精品电影人久久| 久久久久久久久久看片| 国产精品久久久久久久免费软件| 夜夜嗨av一区二区三区四区| 欧美性理论片在线观看片免费| 亚洲免费一级电影| 免费一级欧美片在线播放| 欧美亚男人的天堂| 欧美成人一区二区三区片免费| 久久一综合视频| 欧美日韩一区二区视频在线观看| 欧美性猛交99久久久久99按摩| 在线播放精品| 99riav久久精品riav| 国产日韩欧美黄色| 欧美在线一级视频| 国产精品久久久久久久久久免费看| 亚洲人成久久| 欧美成人精品一区二区| 免费欧美电影| 久久香蕉国产线看观看网| 久久青草欧美一区二区三区| 国产亚洲精品成人av久久ww| 久久激情五月激情| 久久不射电影网| 国产女同一区二区| 国产精品麻豆成人av电影艾秋| 狠狠色丁香久久综合频道| 红桃视频成人| 欧美在线观看日本一区| 欧美网站大全在线观看| 在线亚洲欧美专区二区| 老巨人导航500精品| 亚洲欧美日韩天堂| 国产欧美日韩在线| 一本色道久久综合亚洲精品不卡| 国产精品二区三区四区| 欧美日韩性生活视频| 一本色道久久加勒比精品| 国产精品国产成人国产三级| 欧美精品国产一区二区| 欧美天堂亚洲电影院在线观看| 久久久蜜臀国产一区二区| 99国产精品私拍| 欧美肥婆在线| 欧美国产综合| 亚洲激情欧美| 亚洲伦理中文字幕| 黄色一区二区三区四区| 欧美专区福利在线| 国产一区视频在线观看免费| 久久国产精品久久久久久电车| 欧美一区二区三区视频在线| 国产中文一区二区三区| 在线播放日韩欧美| 国产精品一区二区视频| 亚洲黄色尤物视频| 国产欧美va欧美不卡在线| 国产精品欧美久久| 精品成人在线| 欧美日韩在线免费视频| 久久婷婷国产综合精品青草| 在线国产日韩| 在线一区观看| 亚洲第一黄色| 欧美一区二区三区喷汁尤物| 在线视频你懂得一区| 免费视频一区二区三区在线观看| 欧美日本一区| 欧美四级电影网站| 久久国产乱子精品免费女| 国产精品乱码久久久久久| 性久久久久久| 一区免费在线| 国产精品草莓在线免费观看| 免费看黄裸体一级大秀欧美| 久久夜色精品| 欧美三级黄美女| 久久久久国产一区二区三区| 一色屋精品视频在线观看网站| 乱码第一页成人| 欧美午夜一区二区三区免费大片| 一区二区三区高清在线| 激情六月婷婷综合| 亚洲二区精品| 国产丝袜美腿一区二区三区| 狠狠色丁香婷综合久久| 午夜精品美女久久久久av福利| 乱人伦精品视频在线观看| 欧美日韩伦理在线免费| 亚洲精品一区久久久久久| 亚洲一区二区在线看| 久久永久免费| 国产自产在线视频一区| 国产日韩高清一区二区三区在线| 国产精品美女久久久久久2018| 国产日韩欧美亚洲一区| 激情婷婷久久| 欧美亚洲视频在线观看| 国产精品久久久久免费a∨大胸| 欧美专区一区二区三区| 国产精品少妇自拍| 影音欧美亚洲| 久久久夜夜夜| 久久久久久一区二区| 亚洲国产精品va在线看黑人| 国产精品久久网站| 国产精品一级在线| 国产真实乱子伦精品视频| 国产精品乱人伦中文| 老色批av在线精品| 亚洲精品1234| 久久精品国产亚洲高清剧情介绍| 亚洲人成网站在线播| 亚洲乱码精品一二三四区日韩在线| 国产精品草草| 极品中文字幕一区| 9久草视频在线视频精品| 国产精品乱码一区二三区小蝌蚪| 老色鬼精品视频在线观看播放| 国产精品欧美风情| 91久久精品一区二区别| 国产视频一区在线| 国产精品女人毛片| 在线观看亚洲精品视频| 国产一区二区三区不卡在线观看| 久久aⅴ国产紧身牛仔裤| 日韩视频在线观看免费| 欧美丰满少妇xxxbbb| 国产主播一区二区三区四区| 欧美老女人xx| 久久精品99| 午夜精品在线看| 免费在线欧美黄色| 亚洲国产高清高潮精品美女| 在线精品一区| 国产美女搞久久| 亚洲国产成人91精品| 先锋影院在线亚洲| 国户精品久久久久久久久久久不卡| 欧美日韩国产综合新一区| 欧美成人自拍视频| 国内精品久久久久影院 日本资源| 久久精品女人| 国产亚洲午夜高清国产拍精品| 欧美在线观看网址综合| 久久精品国产亚洲精品| 国产精品九九| 久久久999精品视频| 亚洲第一福利在线观看| 亚洲欧美日韩综合一区| 欧美日韩在线观看一区二区| 一本到12不卡视频在线dvd| 亚洲开发第一视频在线播放| 国产精品成人一区二区网站软件| 美日韩精品视频免费看| 国产美女精品视频免费观看| 一区二区三区精品视频在线观看| 国产精品视频最多的网站| 亚洲最快最全在线视频| 国产精品欧美经典| 久久成人精品电影| 久久久精彩视频| 欧美一区二区| 亚洲午夜一区| 日韩西西人体444www| 国产日韩欧美综合精品| 国产一区二区精品| 日韩天堂在线视频| 亚洲欧洲在线观看| 一区二区三区精品久久久| 又紧又大又爽精品一区二区| 久热国产精品视频| 国产精品实拍| 亚洲欧美激情在线视频| 在线天堂一区av电影| 校园春色国产精品| 亚洲精品一区二区三区在线观看| 欧美成人午夜77777| 国产专区综合网| 日韩视频在线一区二区| 在线一区二区三区做爰视频网站| 永久免费毛片在线播放不卡| 欧美专区18| 在线观看的日韩av| 欧美性猛交xxxx免费看久久久| 欧美一区三区三区高中清蜜桃| 国产精品久久久久免费a∨| 欧美成人亚洲| 欧美性感一类影片在线播放| 国产精品久久久91| 麻豆av福利av久久av| 国产亚洲精品综合一区91| 亚洲激情在线观看| 国产欧美另类| 午夜亚洲性色福利视频| 在线观看一区二区精品视频| 新狼窝色av性久久久久久| 日韩一区二区电影网| 亚洲人成毛片在线播放| 日韩视频一区二区三区在线播放| 国产亚洲免费的视频看| 亚洲福利视频三区| 久久久一区二区三区| 欧美激情精品久久久久久蜜臀| 欧美激情在线狂野欧美精品| 亚洲精品乱码久久久久久蜜桃91| 欧美一区深夜视频| 狠狠色狠狠色综合日日91app| 亚洲国产成人一区| 久久夜色精品| 欧美日本精品| 亚洲女性喷水在线观看一区| 国产自产高清不卡| 国产精品爱久久久久久久| 国产精品一区二区在线观看不卡| 国产一区二区0| 亚洲美女精品成人在线视频| 亚洲电影视频在线| 欧美精品一区二区三区蜜臀| 久久久99国产精品免费|