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

?

觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)庫復(fù)雜業(yè)務(wù)邏輯探討

2018-01-25 03:27羅穎屈俊峰
現(xiàn)代計(jì)算機(jī) 2017年36期
關(guān)鍵詞:觸發(fā)器完整性庫存

羅穎,屈俊峰

(湖北文理學(xué)院數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院,襄陽 441053)

0 引言

MS SQL Server數(shù)據(jù)庫管理系統(tǒng)提供了一套完整性規(guī)則的定義,包括實(shí)體完整性、參照完整性和用戶定義的完整性來維護(hù)數(shù)據(jù)庫中數(shù)據(jù)的正確性和相容性。這3類完整性定義在基本表上,只能實(shí)現(xiàn)基本的完整性維護(hù)功能,如:確保主鍵數(shù)據(jù)不重復(fù)非空、實(shí)現(xiàn)字段有效性和唯一性的檢查、自動(dòng)填入默認(rèn)值、確保數(shù)據(jù)表之間引用(即外鍵)的一致性等功能。但是以下2種情況是上述3類完整性沒有辦法實(shí)現(xiàn)的。

(1)當(dāng)一個(gè)表中有匯總字段時(shí),該匯總字段值是通過該表中其他字段值計(jì)算得出的。每當(dāng)向該表插入記錄時(shí),新插入記錄的匯總字段值必須由該記錄上相應(yīng)的其他字段數(shù)據(jù)計(jì)算得出。

(2)對于兩個(gè)相關(guān)聯(lián)的表,其中一個(gè)表的數(shù)據(jù)改變時(shí),另一個(gè)表中相關(guān)聯(lián)的數(shù)據(jù)也必須隨著更新,即數(shù)據(jù)聯(lián)動(dòng),否則數(shù)據(jù)就不正確了。

在上述2種情況下,定義相應(yīng)的觸發(fā)器來維護(hù)特殊的計(jì)算要求和數(shù)據(jù)聯(lián)動(dòng)等復(fù)雜的業(yè)務(wù)邏輯是必要的,同時(shí)數(shù)據(jù)的維護(hù)是在數(shù)據(jù)庫內(nèi)部執(zhí)行,而不需要應(yīng)用程序來維護(hù),更不需要人工干預(yù)。

下面通過具體的實(shí)例就觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)庫特殊的計(jì)算要求和數(shù)據(jù)聯(lián)動(dòng)等復(fù)雜的業(yè)務(wù)邏輯進(jìn)行探討。

1 簡述2個(gè)基本概念

1.1 觸發(fā)器

觸發(fā)器是用戶定義在數(shù)據(jù)表上的一種被事件驅(qū)動(dòng)的由DBMS調(diào)用執(zhí)行的特殊存儲(chǔ)過程[1]。觸發(fā)器是建立在一個(gè)基本表或視圖上的特殊類型的存儲(chǔ)過程,當(dāng)這個(gè)表發(fā)生了更新操作即Insert、Update或Delete時(shí),會(huì)自動(dòng)被激活執(zhí)行而不需要人工干預(yù),可以處理各種復(fù)雜的業(yè)務(wù)規(guī)則。觸發(fā)器是維護(hù)數(shù)據(jù)庫完整性的另一有力工具。

1.2 Inserted表和Deleted表

inserted表和deleted表是兩個(gè)系統(tǒng)臨時(shí)表。這兩個(gè)表的結(jié)構(gòu)與觸發(fā)器作用的表的結(jié)構(gòu)相同,且由系統(tǒng)自動(dòng)創(chuàng)建和撤銷,只能在觸發(fā)器中引用這2個(gè)表。In?serted表存放insert操作的記錄和update更新后的記錄,deleted表存放delete操作刪除的記錄以及update更新前的記錄。

1.3 For|After觸發(fā)器

For|After:指定DML觸發(fā)器僅在觸發(fā)SQL語句中指定的所有操作都已成功執(zhí)行時(shí)才被觸發(fā)[2]。也就是說after觸發(fā)器是在觸發(fā)命令成功執(zhí)行之后才激活觸發(fā)器,完成觸發(fā)器中規(guī)定的操作,所以,一旦由于一些特殊原因造成更新的記錄不符合要求時(shí),需要在觸發(fā)器中回滾Rollback該操作,避免數(shù)據(jù)出現(xiàn)錯(cuò)誤。After觸發(fā)器要求只執(zhí)行插入、更新、刪除中任一操作之后激活觸發(fā)器執(zhí)行[3]。

2 觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)庫特殊的業(yè)務(wù)規(guī)則和數(shù)據(jù)聯(lián)動(dòng)復(fù)雜業(yè)務(wù)邏輯

2.1 建立商品銷售數(shù)據(jù)庫

為了簡單起見,假設(shè)該數(shù)據(jù)庫僅包含2個(gè)表:商品庫存表和商品銷售表,表結(jié)構(gòu)分別如下:

庫存表 kc(spname(商品名稱),kcprice(庫存單價(jià)),kcqty(庫存數(shù)量),kctotal(庫存金額)),spname為主鍵。業(yè)務(wù)規(guī)則為:kctotal=kcprice×kcqty。

銷售表 xs(spname(商品名稱),buyer(購貨商),xsprice(銷售單價(jià)),xsqty(銷售數(shù)量),xstotal(銷售金額)),spname為主鍵。業(yè)務(wù)規(guī)則為:xstotal=xsprice×xsqty。

這2個(gè)表之間數(shù)據(jù)存在這樣的關(guān)系:每當(dāng)向銷售表插入記錄時(shí),庫存表中相應(yīng)商品的庫存數(shù)量要減去銷售數(shù)量,庫存金額也要根據(jù)該表的業(yè)務(wù)規(guī)則重新計(jì)算。

2.2 為庫存表建立一個(gè)Insert觸發(fā)器維護(hù)特殊的業(yè)務(wù)規(guī)則

為庫存表創(chuàng)建一個(gè)Insert操作的After觸發(fā)器,每當(dāng)向庫存表插入記錄時(shí)觸發(fā)該觸發(fā)器。每當(dāng)插入一條新記錄,保證插入的數(shù)據(jù)中,庫存金額始終等于庫存數(shù)量和庫存單價(jià)的乘積。

創(chuàng)建觸發(fā)器的代碼如下:

上述四條命令,有的符合業(yè)務(wù)規(guī)則,有的不符合。查看商品庫存表,select*from kc,結(jié)果如表1所示。從表中數(shù)據(jù)可以看出,無論輸入數(shù)據(jù)時(shí),庫存金額kctotal是否符合業(yè)務(wù)規(guī)則都沒有關(guān)系,因?yàn)橛辛诉@個(gè)觸發(fā)器,保證了每條記錄的庫存金額始終是符合業(yè)務(wù)規(guī)則的。

表1 庫存表KC

2.3 為銷售表XS建立一個(gè)Insert觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)聯(lián)動(dòng)

為銷售表創(chuàng)建一個(gè)Insert觸發(fā)器,每當(dāng)向銷售表xs插入記錄時(shí),觸發(fā)此觸發(fā)器。該觸發(fā)器完成如下工作:檢查銷售的商品是否在庫存表kc中存在,有以下三種情況:1)kc中不存在此商品;2)kc中有此商品,但是庫存為零;3)kc中存在此商品,且?guī)齑鏀?shù)量大于零,則更新銷售表xs中的銷售金額,維護(hù)該表的業(yè)務(wù)規(guī)則,同時(shí)自動(dòng)減少kc中對應(yīng)商品的庫存數(shù)量kcqty,實(shí)現(xiàn)數(shù)據(jù)聯(lián)動(dòng),并更新庫存表kc中的庫存金額kcto?tal,維護(hù)庫存表的業(yè)務(wù)規(guī)則。其中前2種情況需要提示相應(yīng)的信息,并且回滾該insert操作,避免出現(xiàn)庫存表中不存在或庫存為零的商品卻可以銷售的錯(cuò)誤情況,從而維護(hù)數(shù)據(jù)的完整性。該觸發(fā)器代碼如下:

此商品在庫存表中存在,且?guī)齑娲笥诹悖梢凿N售,命令中的銷售金額不符合業(yè)務(wù)規(guī)則,但是因?yàn)榻⒘舜擞|發(fā)器,銷售金額會(huì)始終符合業(yè)務(wù)規(guī)則,同時(shí)庫存表中的相應(yīng)商品的庫存數(shù)量和庫存金額也隨著更新了,從而實(shí)現(xiàn)了兩個(gè)表中數(shù)據(jù)的聯(lián)動(dòng)。

Insert into xs values('FFER','BUYER2',10,270,2700)

此商品在庫存表中不存在,所以不能銷售,回滾了

此條命令。

Insert into xs values('DDD','BUYER3',10,410,4000)

此商品在庫存中存在,但是庫存小于等于零,即缺貨,所以不能銷售,回滾了此條命令。

查詢銷售表,Select*from xs,如表2所示??梢钥闯觯鲜鋈龡lInsert語句只有第一條成功插入,且銷售金額符合業(yè)務(wù)規(guī)則。

查詢商品庫存表,Select*from kc,如表3所示??梢钥闯?,商品名稱為“AAA”的商品的庫存數(shù)量和庫存金額被自動(dòng)更新了。

表2 商品銷售表xs

表3 商品庫存表kc

觀察表2和表3中數(shù)據(jù)可以看出兩個(gè)表中的數(shù)據(jù)是一致的,每當(dāng)向銷售表中插入一條新記錄,該表上的銷售金額始終符合業(yè)務(wù)規(guī)則,同時(shí)庫存表上該商品的庫存數(shù)量和庫存金額隨著更新,實(shí)現(xiàn)了2個(gè)表之間的數(shù)據(jù)聯(lián)動(dòng)。

由此可以得出:當(dāng)表中某字段的數(shù)據(jù)是通過計(jì)算得出時(shí),建立相應(yīng)觸發(fā)器可以保證該字段數(shù)據(jù)的正確性;當(dāng)表之間數(shù)據(jù)有關(guān)聯(lián)時(shí),即一個(gè)表中的數(shù)據(jù)變動(dòng)會(huì)引起關(guān)聯(lián)表中數(shù)據(jù)的聯(lián)動(dòng),這時(shí)建立一個(gè)觸發(fā)器是明智的,因?yàn)槿斯ぞS護(hù)這樣的數(shù)據(jù)是很麻煩且容易出錯(cuò)的,隨著數(shù)據(jù)量的增加,人工是無法完成的,但是觸發(fā)器就可以很好地勝任此工作,而且不會(huì)出錯(cuò)。由此可以看出觸發(fā)器在數(shù)據(jù)庫完整性的維護(hù)方面起到了不可替代的作用。

當(dāng)然上訴兩個(gè)觸發(fā)器并不完美,因?yàn)椴迦氲挠涗洷仨毷切碌挠涗?,即和表中?shù)據(jù)沒有重復(fù)(因?yàn)樯唐访Q是主鍵),這和現(xiàn)實(shí)是有沖突的。例如:同一種商品需要經(jīng)常進(jìn)貨,同一種商品也需要多次銷售,在這種情況下,上述2個(gè)觸發(fā)器就不能完成這樣的要求了,所以觸發(fā)器要做相應(yīng)改動(dòng),例如改成Instead of觸發(fā)器就可以很好完成上述要求,從而保證數(shù)據(jù)的完整性。由于篇幅有限就不在此做探討了。

3 結(jié)語

綜上所述,可以看出觸發(fā)器在維護(hù)數(shù)據(jù)庫完整性性方面有其特殊的貢獻(xiàn),數(shù)據(jù)庫中數(shù)據(jù)的正確性、有效性、一致性和相容性始終是數(shù)據(jù)庫的宗旨,沒有正確的數(shù)據(jù)就沒有正確的信息,所以當(dāng)數(shù)據(jù)庫中數(shù)據(jù)有特殊的業(yè)務(wù)規(guī)則及復(fù)雜的業(yè)務(wù)邏輯例如數(shù)據(jù)聯(lián)動(dòng)時(shí),設(shè)計(jì)相應(yīng)的觸發(fā)器是數(shù)據(jù)庫數(shù)據(jù)正確性的有力保證。

[1]李虎軍,金泉,邢旺,張政.探析SQL Server觸發(fā)器與完整性約束的區(qū)別[J].電腦知識(shí)與技術(shù),2016(12):10-12.

[2]馬建紅,李占波.數(shù)據(jù)庫原理及應(yīng)用(SQL SQL Server 2008)[M].北京:清華大學(xué)出版社,2011:229.

[3]陳舒心.觸發(fā)器在數(shù)據(jù)庫設(shè)計(jì)中的應(yīng)用[J].廣東教育,2016(4):110-111,119.2016(23):10-12.

猜你喜歡
觸發(fā)器完整性庫存
烏克蘭谷物和油料作物庫存遠(yuǎn)低于2020年同期
烏克蘭谷物和油料作物庫存遠(yuǎn)低于2020年同期
關(guān)于防火門耐火完整性在國標(biāo)、英標(biāo)、歐標(biāo)和美標(biāo)中的比對分析
配置觸發(fā)器有條件啟動(dòng)Windows服務(wù)
ELM及IS/OS完整性對年齡相關(guān)性黃斑變性預(yù)后視力的影響
更正說明
觸發(fā)器在酒店管理系統(tǒng)中的應(yīng)用
房地產(chǎn)去庫存中的金融支持探究
使用SQL Server觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)表的級聯(lián)更新
基于電路原理的觸發(fā)器波形分析
新安县| 晋中市| 中卫市| 集贤县| 周口市| 华坪县| 舒兰市| 文昌市| 忻州市| 平邑县| 疏附县| 南陵县| 师宗县| 崇明县| 安阳市| 信宜市| 德江县| 法库县| 石台县| 石门县| 舞阳县| 德兴市| 木兰县| 承德市| 民勤县| 砚山县| 长垣县| 青浦区| 历史| 同仁县| 米易县| 克山县| 金川县| 安陆市| 扎赉特旗| 靖西县| 朝阳市| 三穗县| 龙胜| 科尔| 台湾省|