国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

DML觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)完整性的應(yīng)用研究

2015-01-06 18:50:45孔麗云
電腦知識(shí)與技術(shù) 2014年34期
關(guān)鍵詞:數(shù)據(jù)庫

孔麗云

摘要:數(shù)據(jù)完整性是確保數(shù)據(jù)庫數(shù)據(jù)安全的重要研究內(nèi)容。通過DML觸發(fā)器技術(shù)實(shí)現(xiàn)數(shù)據(jù)完整性控制,可有效防止由于對(duì)數(shù)據(jù)進(jìn)行頻繁的更新操作從而導(dǎo)致數(shù)據(jù)丟失或無效擴(kuò)散。該文通過論述DML觸發(fā)器的實(shí)現(xiàn)機(jī)制,并結(jié)合具體的開發(fā)實(shí)例,分析DML觸發(fā)器在強(qiáng)制數(shù)據(jù)參照完整性、級(jí)聯(lián)更新與刪除、實(shí)現(xiàn)用戶定義業(yè)務(wù)規(guī)則、更新不可更新視圖等方面的應(yīng)用基本步驟及設(shè)計(jì)技巧,反映了觸發(fā)器應(yīng)用在提高系統(tǒng)性能、簡化數(shù)據(jù)庫操作、維護(hù)數(shù)據(jù)完整性、有效性、增強(qiáng)數(shù)據(jù)庫安全性、提高開發(fā)效率等方面的強(qiáng)大功能。

關(guān)鍵詞:數(shù)據(jù)庫;DML觸發(fā)器;數(shù)據(jù)完整性;T-SQL

中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)34-8087-04

數(shù)據(jù)完整性(Data Integrity)是數(shù)據(jù)安全的三個(gè)基本要點(diǎn)之一[1],是數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā)的重要內(nèi)容。它是指數(shù)據(jù)的精確性(Accuracy) 和可靠性(Reliability),是應(yīng)防止數(shù)據(jù)庫中存在不符合語義規(guī)定的數(shù)據(jù)和防止因錯(cuò)誤信息的輸入輸出造成無效操作或錯(cuò)誤信息而提出的。數(shù)據(jù)完整性分為四類:實(shí)體完整性(Entity Integrity)、域完整性(Domain Integrity)、參照完整性(Referential Integrity)、用戶定義完整性(User-definedIntegrity)。其中域完整性,實(shí)體完整性和參照完整性,是關(guān)系模型必須滿足的完整性約束條件[2]。對(duì)數(shù)據(jù)庫的完整性控制和安全性控制均屬于DBMS提供的數(shù)據(jù)保護(hù)機(jī)制。完整性控制主要包含完整性約束、并發(fā)控制、故障恢復(fù)三種,其中完整性約束是完整性控制的核心。完整性約束可以通過DBMS或應(yīng)用程序來實(shí)現(xiàn),基于DBMS的完整性約束作為模式的一部分存入數(shù)據(jù)庫中,通過DBMS實(shí)現(xiàn)的數(shù)據(jù)完整性按照數(shù)據(jù)庫設(shè)計(jì)步驟進(jìn)行設(shè)計(jì),而由應(yīng)用軟件實(shí)現(xiàn)的數(shù)據(jù)庫完整性則納入應(yīng)用軟件設(shè)計(jì)[3]。DBMS級(jí)的數(shù)據(jù)完整性相當(dāng)于語法級(jí)的數(shù)據(jù)完整性,而要完成語義級(jí)數(shù)據(jù)完整性,除了需建立在語法級(jí)數(shù)據(jù)完整性的基礎(chǔ)上,還應(yīng)完成在應(yīng)用系統(tǒng)層次上的完整性和一致性處理邏輯,在這些邏輯執(zhí)行期間利用語法級(jí)的數(shù)據(jù)完整性來最終實(shí)現(xiàn)對(duì)應(yīng)用系統(tǒng)可用和有效的應(yīng)用級(jí)數(shù)據(jù)完整性。

DBMS級(jí)數(shù)據(jù)完整性實(shí)現(xiàn)機(jī)制包括數(shù)據(jù)類型、規(guī)則、默認(rèn)值、約束、觸發(fā)器和XML架構(gòu)[4]。DBMS級(jí)數(shù)據(jù)完整性除了可有效防止不符合語義規(guī)定的數(shù)據(jù),也可用于定義與實(shí)現(xiàn)業(yè)務(wù)邏輯規(guī)則。由于集中定義更利于降低應(yīng)用程序的復(fù)雜性及提高應(yīng)用程序的運(yùn)行效率。但當(dāng)實(shí)施相對(duì)復(fù)雜的數(shù)據(jù)完整性時(shí),使用觸發(fā)器相對(duì)更為靈活。

1 觸發(fā)器的概述

觸發(fā)器(Trigger)是用戶定義在關(guān)系表上的一類由事件驅(qū)動(dòng)的特殊存儲(chǔ)過程。一般存儲(chǔ)過程是通過調(diào)用過程名及提供所需對(duì)應(yīng)參數(shù)而被執(zhí)行。觸發(fā)器不能被顯式調(diào)用,而是通過對(duì)它所綁定的數(shù)據(jù)表執(zhí)行相關(guān)事件激活觸發(fā)器而被執(zhí)行的。SQL Server 2012 實(shí)現(xiàn)了三種類型的觸發(fā)器: 數(shù)據(jù)操縱語言(DML,Data Manipulation Language)觸發(fā)器,在向表中插入、更新或刪除數(shù)據(jù)等事件發(fā)生時(shí)被觸發(fā);數(shù)據(jù)定義語言觸發(fā)器(DDL,Data Definition Language),在創(chuàng)建、修改或刪除數(shù)據(jù)庫對(duì)象時(shí)觸發(fā);登錄觸發(fā)器,在登錄的身份驗(yàn)證階段完成之后且用戶會(huì)話實(shí)際建立之前為響應(yīng) LOGON 事件而觸發(fā)[5]。

2 DML觸發(fā)器的分類

在觸發(fā)器中,應(yīng)用最為廣泛當(dāng)屬DML觸發(fā)器。DML 觸發(fā)器可用于強(qiáng)制業(yè)務(wù)規(guī)則和數(shù)據(jù)完整性、查詢其他表并包括復(fù)雜的 Transact-SQL 語句。

DML的觸發(fā)事件包括 INSERT、UPDATE 或 DELETE語句。 DML觸發(fā)器一旦被定義,任何用戶對(duì)表或視圖的Insert、Update和Delete操作均由服務(wù)器自動(dòng)激活相應(yīng)的觸發(fā)器,在DBMS核心層進(jìn)行集中的完整性控制[6]。DML觸發(fā)器可分為After 觸發(fā)器、Instead of 觸發(fā)器、CLR觸發(fā)器。

After觸發(fā)器是指導(dǎo)致觸發(fā)器被觸發(fā)的事件被成功執(zhí)行后(如果是在存儲(chǔ)過程,而且有事務(wù),則要在事務(wù)提交之后),觸發(fā)器才會(huì)被激活執(zhí)行,若激活操作違反約束或發(fā)生錯(cuò)誤,則激活操作會(huì)被拒絕或回滾,觸發(fā)器不被觸發(fā);而Instead of 觸發(fā)器是指激活觸發(fā)器的操作(Insert、Update、Delete)被觸發(fā)器中所定義的操作替代,激活觸發(fā)器的語句并不被實(shí)際執(zhí)行,但數(shù)據(jù)更改的變動(dòng)仍可反映到Inserted和Deleted兩張臨時(shí)表中;CLR觸發(fā)器將執(zhí)行托管代碼中編寫的方法,而不用執(zhí)行T-SQL存儲(chǔ)過程。

3 DML觸發(fā)器與約束

實(shí)體完整性(Entity Integrity)通常可通過PRIMARY KEY約束 和 UNIQUE 約束進(jìn)行強(qiáng)制;域完整性可通過CHECK 約束進(jìn)行強(qiáng)制;引用完整性(Referential Integrity)則應(yīng)通過 FOREIGN KEY 約束進(jìn)行強(qiáng)制。 當(dāng)約束支持的功能無法滿足應(yīng)用程序的功能要求時(shí),DML 觸發(fā)器則表現(xiàn)為比約束更為精細(xì)和強(qiáng)大的數(shù)據(jù)控制能力。

1) 約束通常通過標(biāo)準(zhǔn)化的系統(tǒng)錯(cuò)誤信息來傳遞錯(cuò)誤消息,DML觸發(fā)器可自定義消息和錯(cuò)誤處理。

2) 若未使用REFERENCES 子句定義級(jí)聯(lián)引用完整性約束,則可通過DML 觸發(fā)器將更改或刪除以級(jí)聯(lián)方式傳遞給數(shù)據(jù)庫中的相關(guān)表。

3) DML觸發(fā)器可根據(jù)應(yīng)用程序的需要定義比CHECK 約束定義的限制更為復(fù)雜的其他限制。

4) DML 觸發(fā)器可以防止惡意或錯(cuò)誤的 INSERT、UPDATE 以及 DELETE 操作。例如,可通過觸發(fā)器對(duì)不可更新視圖進(jìn)行數(shù)據(jù)操縱。

4 DML觸發(fā)器工作原理

觸發(fā)器由時(shí)間條件、觸發(fā)事件和動(dòng)作組成。確定觸發(fā)器的邏輯結(jié)構(gòu),就是確定觸發(fā)器的時(shí)間條件、觸發(fā)事件和動(dòng)作以及觸發(fā)器的選項(xiàng)[7]。將觸發(fā)器和觸發(fā)它的語句作為可在觸發(fā)器內(nèi)回滾的單個(gè)事務(wù)對(duì)待。如果檢測到錯(cuò)誤則整個(gè)事務(wù)即自動(dòng)回滾[8]。在使用觸發(fā)器過程中,因觸發(fā)器被觸發(fā)后所產(chǎn)生的Inserted和Deleted兩張邏輯表發(fā)揮著重要作用。它們具有只讀性,并在觸發(fā)器執(zhí)行完畢后從內(nèi)存中刪除,而非實(shí)際存儲(chǔ)在數(shù)據(jù)庫中的物理表。這兩張表的表結(jié)構(gòu)與觸發(fā)器所在的數(shù)據(jù)表結(jié)構(gòu)完全一致。endprint

若觸發(fā)事件為Insert操作,觸發(fā)器被觸發(fā)后,將對(duì)觸發(fā)器所屬表新增記錄的副本填充至Inserted表中;若觸發(fā)事件為Update操作,觸發(fā)器被觸發(fā)后,將對(duì)觸發(fā)器所屬表被修改記錄更新后的副本填充至Inserted表中,將被修改記錄更新前的記錄副本填充至Deleted表中;若觸發(fā)事件為Delete操作,觸發(fā)器被觸發(fā)后,將對(duì)觸發(fā)器所屬表中被刪除記錄的副本填充至Deleted表。通過這兩張邏輯表,可了解數(shù)據(jù)在被操作前后的差異狀態(tài),并基于此差異采取行動(dòng)。

5 DML觸發(fā)器的應(yīng)用

下面以學(xué)生成績管理庫(PXSCJ)為例,說明觸發(fā)器在數(shù)據(jù)完整性方面的具體應(yīng)用。PXSCJ庫包含學(xué)生信息表XSB(學(xué)號(hào),姓名,性別,出生年月,專業(yè),總學(xué)分,備注);課程信息表KCB(課程號(hào),課程名,開課學(xué)期,學(xué)時(shí),學(xué)分);成績CJB表(學(xué)號(hào),課程號(hào),成績)。

5.1 強(qiáng)制參照完整性

在從表中創(chuàng)建觸發(fā)器,當(dāng)向從表插入新記錄或更新記錄時(shí),觸發(fā)器被觸發(fā),檢查假設(shè)插入或更新操作完成后,從表中外鍵的數(shù)據(jù)是否存在于主表中的主鍵或唯一鍵,若不存在則插入或更新操作不允許被執(zhí)行。同時(shí),代碼設(shè)計(jì)應(yīng)滿足于多行記錄同時(shí)被插入的情況。如為保證向成績表CJB插入或更新記錄后,該記錄的學(xué)號(hào)能存在于學(xué)生信息表XSB、課程號(hào)能存在于課程信息表KCB,創(chuàng)建觸發(fā)器CJB_ trigger。實(shí)現(xiàn)過程如下:

5.2 級(jí)聯(lián)更新或刪除

當(dāng)需要實(shí)現(xiàn)主從表數(shù)據(jù)級(jí)聯(lián)一致時(shí),可直接基于從表創(chuàng)建外鍵約束,但由于外鍵約束會(huì)導(dǎo)致當(dāng)需要對(duì)主表的主鍵或唯一鍵進(jìn)行修改或刪除操作時(shí)無法執(zhí)行。因此,通過創(chuàng)建觸發(fā)器,可實(shí)現(xiàn)主從表級(jí)聯(lián)更新或刪除,從而提高數(shù)據(jù)操作的靈活性。如:當(dāng)修改學(xué)生信息表XSB中某個(gè)學(xué)生的學(xué)號(hào)時(shí),能實(shí)現(xiàn)級(jí)聯(lián)修改該生在成績表CJB中對(duì)應(yīng)的記錄的學(xué)號(hào);當(dāng)刪除學(xué)生信息表XSB中某個(gè)學(xué)生的記錄時(shí),能實(shí)現(xiàn)級(jí)聯(lián)刪除該生在成績表CJB中對(duì)應(yīng)的記錄,創(chuàng)建觸發(fā)器XSB_delup。同理,當(dāng)修改課程信息表KCB中某門課程的課程號(hào)時(shí),能實(shí)現(xiàn)級(jí)聯(lián)修改該生在成績表CJB中對(duì)應(yīng)的記錄的課程號(hào);當(dāng)刪除課程信息表KCB中某門課程的記錄時(shí),能實(shí)現(xiàn)級(jí)聯(lián)刪除該生在成績表CJB中對(duì)應(yīng)的記錄,創(chuàng)建觸發(fā)器KCB_delup。實(shí)現(xiàn)過程如下:

5.3 實(shí)現(xiàn)用戶定義業(yè)務(wù)規(guī)則

在數(shù)據(jù)庫里,數(shù)據(jù)表之間經(jīng)常會(huì)出現(xiàn)某些數(shù)據(jù)列相互之間存在業(yè)務(wù)規(guī)則上的相關(guān)性,則可通過創(chuàng)建觸發(fā)器提高維護(hù)效率。當(dāng)對(duì)表間相關(guān)列的數(shù)據(jù)進(jìn)行增、改、刪的操作時(shí),能同時(shí)自動(dòng)更新對(duì)應(yīng)列的數(shù)據(jù),使相關(guān)列之間的數(shù)據(jù)自動(dòng)保持一致,從而降低人工維護(hù)成本。如:在學(xué)生信息表XSB、學(xué)生成績表CJB、課程信息表KCB中,有一個(gè)相關(guān)三張表的特殊列,即學(xué)生信息表XSB的總學(xué)分。當(dāng)對(duì)CJB進(jìn)行增、改、刪成績時(shí),或?qū)CB的學(xué)分列進(jìn)行修改時(shí),要求XSB的總分列要實(shí)現(xiàn)同步更新。利用觸發(fā)器讓其實(shí)現(xiàn)自動(dòng)更新,保證相關(guān)列數(shù)據(jù)的一致性。

1) 向?qū)W生成績表CJB添加學(xué)生課程成績時(shí),若成績大于等于60時(shí),即可獲得相應(yīng)的學(xué)分,并重新累計(jì)于學(xué)生信息表XSB中的總學(xué)分列,當(dāng)刪除學(xué)生成績表CJB中的記錄時(shí),學(xué)生信息表XSB中的總學(xué)分應(yīng)亦能自動(dòng)發(fā)生更新。當(dāng)對(duì)CJB表進(jìn)行更新操作時(shí),若修改列僅為課程號(hào)或成績時(shí),則只需獲得記錄在被修改前后的總學(xué)分差值,然后累加至XSB表中對(duì)應(yīng)記錄的原總學(xué)分即可。但若修改列為學(xué)號(hào),則需修改XSB表中兩個(gè)學(xué)生的總學(xué)分。因此,必須對(duì)觸發(fā)器CJB_trigger進(jìn)行進(jìn)一步優(yōu)化和整合,最后代碼為:

5.4 更新不可更新視圖

在PXSCJ數(shù)據(jù)庫中創(chuàng)建視圖stu_view,包含學(xué)號(hào)、姓名、專業(yè)、課程號(hào)、課程名、成績。該視圖依賴于基表XSB、CJB、KCB,屬不可更新的視圖。通過在視圖上創(chuàng)建instead of觸發(fā)器,當(dāng)向視圖插入數(shù)據(jù)時(shí),分別向XSB、CJB、KCB插入數(shù)據(jù),從而實(shí)現(xiàn)向視圖插入數(shù)據(jù)的功能。

6 結(jié)束語

通過上述實(shí)例可知,觸發(fā)器在維護(hù)數(shù)據(jù)庫數(shù)據(jù)完整性時(shí)表現(xiàn)出強(qiáng)大的功能,尤其對(duì)于處理較為復(fù)雜的業(yè)務(wù)規(guī)則定義時(shí)所具備的靈活性,大大提高了數(shù)據(jù)庫系統(tǒng)的開發(fā)效率。值得注意的是觸發(fā)器不可濫用,尤其是當(dāng)形成觸發(fā)器鏈的時(shí)候容易出現(xiàn)連環(huán)觸發(fā)而導(dǎo)致錯(cuò)誤,并造成不必要的損耗[9]。

參考文獻(xiàn):

[1] 360百科.數(shù)據(jù)完整性[EB/OL].(2014-04-14). http://baike.so.com/doc/5858667.html.

[2] 劉艷春.運(yùn)用SQL Server 開發(fā)軟件參照完整性實(shí)現(xiàn)方法[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013,23(6):117-121.

[3] Behrend A,Doranc,Manthey R.SQL Triggers Reacting on Time Events:An Extension Proposal[C]//Proceedings of the 13th East European Conference on Advances in Databases and Information Systems,2009.

[4] 王珊,薩師煊.數(shù)據(jù)庫系統(tǒng)概論[M].4版.北京:高等教育出版社,2006:160-163.

[5] Natarajan J,Bruchez R,Shaw S,et al. Pro T - SQL 2012 programmers guide[ M] . GRE:Springer,2012.

[6] 貝爾實(shí)驗(yàn)室.數(shù)據(jù)庫系統(tǒng)概念[M].4版.北京:機(jī)械工業(yè)出版社,2003:161.

[7] Fakas G J,Cawley B,Cai Zhi.Autom ated Generation of Personal Data Reports from Relational Databases[J].Journal of Information &Knowled ge Management (JIKM ),2011,10(2) :193-208.

[8] MSDN.DML觸發(fā)器[EB/OL].(2014-04-14). http://msdn.microsoft.com/zh-cn/library/ms178110.aspx.

[9] 西爾伯沙茨.數(shù)據(jù)庫系統(tǒng)概念[M]. 6版.北京:機(jī)械工業(yè)出版社,2012:143.endprint

猜你喜歡
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
數(shù)據(jù)庫
陵川县| 南京市| 贺兰县| 乐安县| 湖北省| 潍坊市| 闽侯县| 阿巴嘎旗| 象山县| 三江| 全南县| 微博| 长乐市| 林芝县| 门源| 西乌珠穆沁旗| 高碑店市| 远安县| 枣庄市| 淮滨县| 托里县| 三江| 六枝特区| 文安县| 石景山区| 苗栗县| 白河县| 上林县| 抚州市| 噶尔县| 平远县| 顺昌县| 龙胜| 永定县| 福泉市| 张家口市| 江油市| 永昌县| 香格里拉县| 巴马| 兴城市|