摘 要SQL SERVER 觸發(fā)器是一個(gè)特定的數(shù)據(jù)信息存儲(chǔ)程序 它由用戶確定 并在消息表或數(shù)據(jù)庫系統(tǒng)內(nèi)容上進(jìn)行處理 觸發(fā)器無法被用戶進(jìn)行處理 也無法接收各種功能 它們通常由事件驅(qū)動(dòng) 由DBMS函數(shù)實(shí)現(xiàn) 當(dāng)用戶在消息表中進(jìn)行DELETE,INSERT,UPDATE 操作時(shí) 觸發(fā)器會(huì)被激活 并能夠進(jìn)行相關(guān)的處理 為確保操作能夠順利完成 觸發(fā)器必須遵守規(guī)定的限制原則 一旦觸發(fā)器被運(yùn)行 所有動(dòng)作都將被視為一次事務(wù)處理 若事務(wù)未能成功完成 則DBMS 將回到事務(wù)開始前的狀態(tài)觸發(fā)器可以用來檢查數(shù)據(jù)規(guī)范 條件和默認(rèn)值的完整性 檢測(cè)更復(fù)雜的信息 以及運(yùn)行更復(fù)雜的業(yè)務(wù)邏輯 在此基礎(chǔ)上 文章深入探討SQL SERVER 觸發(fā)器的種類 特性及其形成的2 種臨時(shí)表 并著力闡述觸發(fā)器在提升數(shù)據(jù)分析完整性方面的應(yīng)用 及其相關(guān)的事宜 旨在為數(shù)據(jù)庫系統(tǒng)設(shè)計(jì)者提供有效的參考 幫助其更好地控制數(shù)據(jù)完整性
關(guān)鍵詞SQL SERVER 觸發(fā)器 應(yīng)用
中圖法分類號(hào)tp311 ?文獻(xiàn)標(biāo)識(shí)碼a
1 引言
數(shù)據(jù)庫系統(tǒng)是信息系統(tǒng)開發(fā)和運(yùn)行的基礎(chǔ),而其存儲(chǔ)數(shù)據(jù)的準(zhǔn)確性則是至關(guān)重要的。為確保數(shù)據(jù)的準(zhǔn)確性,各種DBMS 提供了多種檢測(cè)和檢查方法,而靈活和合理地使用觸發(fā)器可以有效地提升信息系統(tǒng)的數(shù)據(jù)準(zhǔn)確性,一般而言,數(shù)據(jù)庫系統(tǒng)開發(fā)人員會(huì)采用一些數(shù)據(jù)約束來確保數(shù)據(jù)的完整性。但是,當(dāng)面對(duì)復(fù)雜的檢查策略和操作時(shí),SQL SERVER 提供了一種更加有效的方法———觸發(fā)器。
2 SQL SERVER 觸發(fā)器含義及分類
2.1 SQL SERVER 觸發(fā)器含義
觸發(fā)器是由事件驅(qū)使的數(shù)據(jù)存儲(chǔ)過程,它可以被使用者定義在數(shù)據(jù)表上,并且可以被DBMS 自動(dòng)調(diào)用運(yùn)行。當(dāng)使用者在數(shù)據(jù)表中進(jìn)行任何操作,如更改、撤銷、進(jìn)入或建立資料數(shù)據(jù)庫對(duì)象等,觸發(fā)器將會(huì)自動(dòng)響應(yīng),從而實(shí)現(xiàn)統(tǒng)計(jì)信息的有效管理和分析。
2.2 SQL SERVER 觸發(fā)器分類
SQL SERVER 觸發(fā)器能夠根據(jù)引發(fā)事件的差異而分為Data Definition Language 和Data ManipulationLanguage 2 種,前者以數(shù)據(jù)編程語言為基礎(chǔ),后者以數(shù)據(jù)過程語句為基礎(chǔ)。
DDL 觸發(fā)器可以用來處理各種DDL 事情,包括用戶進(jìn)入和后退、CREATE、DROP、ALTER 語句等。它不僅可以用來檢查標(biāo)準(zhǔn)數(shù)據(jù)庫系統(tǒng)中的表結(jié)構(gòu)和視圖結(jié)構(gòu),還可以作為應(yīng)用系統(tǒng)管理主要任務(wù),以確保信息系統(tǒng)的安全性和可靠性。
DML 觸發(fā)器是一種可以回應(yīng)用戶DML 執(zhí)行行為的機(jī)制,它可以檢查表或視圖中的INSERT,DELETE和UPDATE 動(dòng)作是否符合業(yè)務(wù)規(guī)則,從而確保數(shù)據(jù)的完整性,并且可以在DML 編輯數(shù)據(jù)時(shí)引發(fā)執(zhí)行,以提高數(shù)據(jù)處理的效率和準(zhǔn)確性。
DML 觸發(fā)器可以根據(jù)在前面還是后面執(zhí)行來劃分,這種劃分方式被稱為INSTEAD OF 和AFTER(FOR)觸發(fā)器。
INSTEAD OF 觸發(fā)器是一種在數(shù)據(jù)運(yùn)算之前執(zhí)行的程序, 它可以定義在視圖或表上, 用于替代DELETE,UPDATE 和INSERT 等功能,從而實(shí)現(xiàn)信息的有效處理。每個(gè)INSTEAD OF 觸發(fā)器只能被定義一次,以確保信息的有效處理,它可以在數(shù)據(jù)變動(dòng)之前被調(diào)用,替代用戶的操作語句,從而實(shí)現(xiàn)觸發(fā)器所定義的操作,使用戶能夠更加輕松地完成任務(wù)。
在DML 語句結(jié)束執(zhí)行后,AFTER(FOR)觸發(fā)器會(huì)被激活,以檢測(cè)被執(zhí)行的信息是否合乎業(yè)務(wù)規(guī)則,若不合乎規(guī)則,則會(huì)回到該數(shù)據(jù)操作前的狀態(tài)。在同一張數(shù)據(jù)表上,可以定義多個(gè)AFTER(FOR)觸發(fā)器,而不僅僅是在表格中,AFTER 觸發(fā)器可以在大量數(shù)據(jù)動(dòng)作結(jié)束后被調(diào)動(dòng)運(yùn)行,根據(jù)變化后的信息,對(duì)相關(guān)業(yè)務(wù)規(guī)范做出審查,從而決定是否接受或拒絕這些變化。
3 臨時(shí)表
SQL SERVER 在運(yùn)行DML 觸發(fā)器時(shí),會(huì)產(chǎn)生2 種只讀型臨時(shí)表,即DELETED 表和INSERTED 表。它們僅出現(xiàn)在存儲(chǔ)器中,其結(jié)構(gòu)與激活DML 觸發(fā)器的視圖或基表相似,但功能卻有所不同。
3.1 DELETED 表
DELETED 表是一個(gè)存儲(chǔ)器,它只保存用于進(jìn)行UPDATE 或delete 運(yùn)算的舊數(shù)據(jù)行。當(dāng)這些數(shù)據(jù)行被更新或移除時(shí), 它們將從原有的基表中遷移到DELETED 表。
3.2 INSERTED 表
INSERTED 表是一個(gè)存儲(chǔ)系統(tǒng),它可以存儲(chǔ)本次UPDATE 和INSERT 操作所產(chǎn)生的新數(shù)據(jù)行。當(dāng)執(zhí)行UPDATE 或INSERT 操作時(shí),這些新數(shù)據(jù)行會(huì)被插入到基表中,并被復(fù)制到INSERTED 表中。
事實(shí)上,UPDATE 操作是由DELETE 和INSERT2個(gè)步驟組成的。在UPDATE 操作中,DBMS 會(huì)將需要更新的數(shù)據(jù)行從基表中移除, 并將其移動(dòng)到DELETED 表中, 最后將新的數(shù)據(jù)行同樣移入INSERTED 表和基表中。
4 SQL SERVER 觸發(fā)器應(yīng)用
觸發(fā)器機(jī)制應(yīng)該被視為Windows 系統(tǒng)的一種消息響應(yīng)機(jī)制,它能夠在數(shù)據(jù)表上實(shí)施更加復(fù)雜的檢查和操作,同時(shí)提供更加精確和強(qiáng)力的數(shù)據(jù)信息控制功能。此外,DDL 觸發(fā)器還能夠用于各類應(yīng)用管理,從而有效地提升數(shù)據(jù)庫應(yīng)用控制系統(tǒng)的可靠性。
4.1 實(shí)現(xiàn)CHECK 約束檢查功能
DML 觸發(fā)器可以靈活編寫代碼,以處理各種業(yè)務(wù)邏輯,因此它可以設(shè)置比CHECK 約束更加復(fù)雜、強(qiáng)大的數(shù)據(jù)檢查規(guī)則。當(dāng)數(shù)據(jù)庫系統(tǒng)設(shè)計(jì)者需要發(fā)出差錯(cuò)消息以提醒用戶時(shí),CHECK 約束根本無法滿足需求,而觸發(fā)器可以有效地實(shí)現(xiàn)這一目標(biāo)。并且當(dāng)需要使用其他表格中的數(shù)據(jù)時(shí),觸發(fā)器可以提供有效的支持,而CHECK 約束則可以提供更多的靈活性和便利性。
4.2 數(shù)據(jù)庫設(shè)計(jì)與批量數(shù)據(jù)導(dǎo)入
在信息系統(tǒng)工程設(shè)計(jì)中,表內(nèi)部結(jié)構(gòu)的改變和完善是不可避免的。因此,在表上設(shè)計(jì)各種限制以及表與表之間的引用關(guān)系等,都必須進(jìn)行精確的計(jì)算,以確保數(shù)據(jù)庫系統(tǒng)的正常運(yùn)行。然而,由于表內(nèi)部結(jié)構(gòu)的變化,原有的完整性限制都必須被取消,而重新建立各種限制又會(huì)造成一定的不便,這就給設(shè)計(jì)者提出了極大的挑戰(zhàn)。通過觸發(fā)器來設(shè)置有關(guān)限制規(guī)定,能夠在表內(nèi)部結(jié)構(gòu)發(fā)生變化時(shí),快速禁用觸發(fā)器,從V,)"而節(jié)省時(shí)間和精力,同時(shí)能夠便捷地修復(fù)觸發(fā)器的應(yīng)用,大幅提高了信息系統(tǒng)產(chǎn)品設(shè)計(jì)和測(cè)試的效率。
5 合理選擇觸發(fā)器與完整性約束
數(shù)據(jù)完整性約束和觸發(fā)器的作用機(jī)制各有不同,它們?cè)谕瓿刹煌蝿?wù)時(shí)各有優(yōu)勢(shì)和不足。
5.1 首選完整性約束
一般而言,只要能夠滿足應(yīng)用系統(tǒng)業(yè)務(wù)邏輯的完整性要求,就應(yīng)該采取完整性約束措施。完整性是一個(gè)關(guān)系數(shù)據(jù)庫系統(tǒng)的基本要求,它能夠通過建立主鍵、外鍵、值域和用戶定義的約束來實(shí)現(xiàn)。應(yīng)用的完整性是至關(guān)重要的,因此應(yīng)盡可能采用FOREIGNKEY 約束來強(qiáng)制執(zhí)行。若完整性能夠符合應(yīng)用的需求,則應(yīng)該通過CHECK 約束來確保執(zhí)行的有效性[1~2] 。
5.2 使用觸發(fā)器以滿足復(fù)雜的特殊需求
觸發(fā)器是一種有效的解決方案,它可以使用SQL語句來處理復(fù)雜的邏輯,從而滿足完整性約束的要求。然而,它并不總是最優(yōu)的選擇,在完整性約束根本無法滿足用戶需求時(shí),觸發(fā)器就顯得尤為重要。
5.2.1 CHECK 約束無法滿足特殊檢查
CHECK 條件雖然快速且效率高,但它無法滿足所有檢查要求。觸發(fā)器能夠根據(jù)需要定制更復(fù)雜、更強(qiáng)大的檢查規(guī)則,而CHECK 條件只能用于同一個(gè)表中的數(shù)字,因此它只能通過邏輯表示或者同一個(gè)列的另一值來檢驗(yàn)列值。一旦需要檢驗(yàn)列值,觸發(fā)器就能夠提供有效地支持,從而使用戶能夠從多個(gè)表中獲取有效的信息。比如,觸發(fā)器能夠從同一個(gè)數(shù)據(jù)庫系統(tǒng)的SELECT 結(jié)果中接入或修改相關(guān)的信息,以便更準(zhǔn)確地識(shí)別出列值。
5.2.2 對(duì)中間數(shù)據(jù)進(jìn)行處理
當(dāng)我們不關(guān)心表中某個(gè)字段的過去或現(xiàn)在的值,只想知道變化的程度時(shí),雖然沒有列表可以提供這些信息,但是可以通過觸發(fā)器中的INSERTED 臨時(shí)表和DELETED 臨時(shí)表來計(jì)算出變化的程度,從而獲得有關(guān)變化的信息。觸發(fā)器可以檢測(cè)數(shù)據(jù)在各個(gè)表中的變化,并根據(jù)這些變化采取相應(yīng)的應(yīng)對(duì)措施,以確保數(shù)據(jù)的準(zhǔn)確性和完整性。
5.2.3 方便完整性更改
當(dāng)表內(nèi)部結(jié)構(gòu)發(fā)生變化時(shí),原有的完整性約束必須被刪除,這使得數(shù)據(jù)庫系統(tǒng)設(shè)計(jì)師面臨著巨大的挑戰(zhàn),因?yàn)樵谠俅蝿?chuàng)建表之前,必須先確保毫無疏漏,這會(huì)給數(shù)據(jù)庫系統(tǒng)設(shè)計(jì)師造成極大的麻煩。觸發(fā)器不僅僅關(guān)注表內(nèi)部結(jié)構(gòu)的變化,還關(guān)注表內(nèi)部結(jié)構(gòu)是否能夠正常運(yùn)行。因此,當(dāng)表結(jié)構(gòu)發(fā)生變化時(shí),只需要禁用觸發(fā)器,就能夠?yàn)閿?shù)據(jù)庫系統(tǒng)開發(fā)者帶來便利。在數(shù)據(jù)庫系統(tǒng)開發(fā)過程中,應(yīng)該先采用觸發(fā)器來確保引用完整性, 然后在開發(fā)完成后, 將其更改為DRI[3~4] 。
6 SQL SERVER 觸發(fā)器應(yīng)用注意事項(xiàng)
6.1 觸發(fā)器執(zhí)行不是主動(dòng)執(zhí)行
AFTER 觸發(fā)器是一種在事情產(chǎn)生后被啟動(dòng)的引發(fā)語言,它會(huì)將引發(fā)語言運(yùn)行的結(jié)果記載在日志中,但并沒有進(jìn)行提交。這表明, 一旦觸發(fā)器要求rollback,就必須取消此前已進(jìn)行的一系列操作,從而影響系統(tǒng)性能。因此,觸發(fā)器的效率取決于引發(fā)語言的工作量。約束是一種主動(dòng)的行為,它們?cè)趯?shí)際語言產(chǎn)生之前就會(huì)發(fā)揮作用,以阻止失敗的產(chǎn)生。約束的執(zhí)行速度要比其他行為快得多,但是當(dāng)引發(fā)語言變得更加復(fù)雜、影響數(shù)據(jù)量更大時(shí),使用觸發(fā)器可以帶來更高的效率。
6.2 保持觸發(fā)器簡(jiǎn)潔
觸發(fā)器是一種特殊的事務(wù),可以在語句結(jié)束時(shí)觸發(fā)它。如果觸發(fā)器語句包含大量的代碼,那么觸發(fā)器會(huì)持續(xù)運(yùn)行很長(zhǎng)時(shí)間,這意味著每一段代碼都需要花費(fèi)大量的時(shí)間來完成。觸發(fā)器的執(zhí)行需要一段時(shí)間,而SQL 語句則需要在觸發(fā)器完成后才能正式執(zhí)行。若觸發(fā)器在執(zhí)行過程中發(fā)現(xiàn)錯(cuò)誤,則它會(huì)自動(dòng)重新開始,這樣一來,降低了整個(gè)應(yīng)用系統(tǒng)的運(yùn)行效率,導(dǎo)致性能下降。
6.3 盡量避免在觸發(fā)器中回滾
盡管回滾是觸發(fā)器中最常見的任務(wù), 但由于AFTER 觸發(fā)器在大部分操作完成后才會(huì)發(fā)生,因此回滾的成本較高,為了節(jié)省成本,推薦盡量采用DRI。在觸發(fā)器中應(yīng)用多條ROLLBACK 語句時(shí),最好在完成啟動(dòng)觸發(fā)器以前就發(fā)現(xiàn)可能存在的問題,并立即進(jìn)行檢查,以避免錯(cuò)誤發(fā)生,而不是等到觸發(fā)器發(fā)出回滾信號(hào)。觸發(fā)器能夠有效地防止或回滾偏離業(yè)務(wù)邏輯規(guī)律的動(dòng)作,但應(yīng)盡量避免使用回滾,因?yàn)樗鼤?huì)導(dǎo)致大量動(dòng)作被撤銷,并增加系統(tǒng)運(yùn)行的成本。尤其是當(dāng)涉及大量信息時(shí),或許會(huì)導(dǎo)致數(shù)據(jù)庫系統(tǒng)服務(wù)質(zhì)量急劇下降,所以,建議盡可能使用完整性約束,而不過度依賴觸發(fā)器。
7 結(jié)束語
使用觸發(fā)器能夠協(xié)助數(shù)據(jù)庫信息管理系統(tǒng)設(shè)計(jì)者和維護(hù)者實(shí)現(xiàn)繁雜的各種功能,從而提升信息系統(tǒng)的完整性。但是,應(yīng)該謹(jǐn)慎使用觸發(fā)器,因?yàn)檫^度使用會(huì)導(dǎo)致系統(tǒng)維護(hù)變得困難。所以,在數(shù)據(jù)庫信息管理系統(tǒng)產(chǎn)品設(shè)計(jì)中,應(yīng)盡可能采用DRI 來確保數(shù)據(jù)信息完全。通過適當(dāng)應(yīng)用觸發(fā)器,能夠有效保護(hù)數(shù)據(jù)表中的各種數(shù)據(jù)信息,使其更加安全可靠,極大地減少數(shù)據(jù)庫信息管理系統(tǒng)設(shè)計(jì)者的操作量,從而達(dá)到事半功倍的效果。
參考文獻(xiàn):
[1] 王珊.?dāng)?shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2012.
[2] 鄒建.深入淺出SQL SERVER 2005 開發(fā)、管理與應(yīng)用實(shí)例[M].北京:人民郵電出版社,2008.
[3] 李霞. SQL SERVER 約束在維護(hù)數(shù)據(jù)完整性中的運(yùn)用[J].晉城職業(yè)技術(shù)學(xué)院學(xué)報(bào),2012(5):16?19.
[4] 張峰.觸發(fā)器在數(shù)據(jù)處理過程中的應(yīng)用研究[J].計(jì)算機(jī)工程與科學(xué),2008(5):156?158.
作者簡(jiǎn)介:
邢偉杰( 1981—), 碩士, 講師, 研究方向: 計(jì)算機(jī)科學(xué)技術(shù)。
計(jì)算機(jī)應(yīng)用文摘·觸控2023年14期