觸發(fā)器的定義
觸發(fā)器(trigger)是SQLserver提供給程序員和數(shù)據(jù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動,而是由事件來觸發(fā),比如當(dāng)對一個表進行操作(insert,delete,update)時就會激活它執(zhí)行。觸發(fā)器經(jīng)常用于加強數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等。
觸發(fā)器的特點
1.自動執(zhí)行。觸發(fā)器在對表的數(shù)據(jù)作了任何修改(比如手工輸入或者應(yīng)用程序的操作)之后立即被激活。
2.級聯(lián)更新。觸發(fā)器可以通過數(shù)據(jù)庫中的相關(guān)表進行層疊更改,這比直接把代碼寫在前臺的做法更安全合理。
3.強化約束。觸發(fā)器可以引用其它表中的列,能夠?qū)崿F(xiàn)比CHECK約束更為復(fù)雜的約束。
4.跟蹤變化。觸發(fā)器可以阻止數(shù)據(jù)庫中未經(jīng)許可的指定更新和變化。
5.強制業(yè)務(wù)邏輯。觸發(fā)器可用于執(zhí)行管理任務(wù),并強制影響數(shù)據(jù)庫的復(fù)雜業(yè)務(wù)規(guī)則。
觸發(fā)器的分類
DML觸發(fā)器
當(dāng)數(shù)據(jù)庫中表中的數(shù)據(jù)發(fā)生變化時,包括insert,update,delete任意操作,如果我們對該表寫了對應(yīng)的DML觸發(fā)器,那么該觸發(fā)器自動執(zhí)行。DML觸發(fā)器的主要作用在于強制執(zhí)行業(yè)務(wù)規(guī)則,以及擴展SqlServer約束,默認(rèn)值等。因為我們知道約束只能約束同一個表中的數(shù)據(jù),而觸發(fā)器中則可以執(zhí)行任意Sql命令。
DDL觸發(fā)器
它是SqlServer2005新增的觸發(fā)器,主要用于審核與規(guī)范對數(shù)據(jù)庫中表,觸發(fā)器,視圖等結(jié)構(gòu)上的操作。比如在修改表,修改列,新增表,新增列等。它在數(shù)據(jù)庫結(jié)構(gòu)發(fā)生變化時執(zhí)行,我們主要用它來記錄數(shù)據(jù)庫的修改過程,以及限制程序員對數(shù)據(jù)庫的修改,比如不允許刪除某些指定表等。
登錄觸發(fā)器
登錄觸發(fā)器將為響應(yīng)LOGIN事件而激發(fā)存儲過程。與SQLServer實例建立用戶會話時將引發(fā)此事件。登錄觸發(fā)器將在登錄的身份驗證階段完成之后且用戶會話實際建立之前激發(fā)。因此,來自觸發(fā)器內(nèi)部且通常將到達(dá)用戶的所有消息(例如錯誤消息和來自PRINT語句的消息)會傳送到SQLServer錯誤日志。如果身份驗證失敗,將不激發(fā)登錄觸發(fā)器。
觸發(fā)器的作用
觸發(fā)器的主要作用就是其能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。除此之外,觸發(fā)器還有其它許多不同的功能:
觸發(fā)器能夠?qū)崿F(xiàn)比CHECK語句更為復(fù)雜的約束。
?。?)跟蹤變化Auditingchanges
觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,從而不允許數(shù)據(jù)庫中未經(jīng)許可的指定更新和變化。
?。?)級聯(lián)運行(Cascadedoperation)。
觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,并自動地級聯(lián)影響整個數(shù)據(jù)庫的各項內(nèi)容。例如,某個表上的觸發(fā)器中包含有對另外一個表的數(shù)據(jù)操作(如刪除,更新,插入)而該操作又導(dǎo)致該表上觸發(fā)器被觸發(fā)。
?。?)存儲過程的調(diào)用(Storedprocedureinvocation)。
為了響應(yīng)數(shù)據(jù)庫更新觸,發(fā)器可以調(diào)用一個或多個存儲過程,甚至可以通過外部過程的調(diào)用而在DBMS(數(shù)據(jù)庫管理系統(tǒng))本身之外進行操作。
由此可見,觸發(fā)器可以解決高級形式的業(yè)務(wù)規(guī)則或復(fù)雜行為限制以及實現(xiàn)定制記錄等一些方面的問題。例如,觸發(fā)器能夠找出某一表在數(shù)據(jù)修改前后狀態(tài)發(fā)生的差異,并根據(jù)這種差異執(zhí)行一定的處理。此外一個表的同一類型(INSERT、UPDATE、DELETE)的多個觸發(fā)器能夠?qū)ν环N數(shù)據(jù)操作采取多種不同的處理。
總體而言,觸發(fā)器性能通常比較低。當(dāng)運行觸發(fā)器時,系統(tǒng)處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在內(nèi)存中也不在數(shù)據(jù)庫設(shè)備上,而刪除表和插入表總是位于內(nèi)存中。可見觸發(fā)器所參照的其它表的位置決定了操作要花費的時間長短。
觸發(fā)器的工作原理
由于使表中數(shù)據(jù)發(fā)生變化的操作有插入、更新和刪除,所以觸發(fā)器可以分為三類:INSERT觸發(fā)器、UPDATE觸發(fā)器和DELETE觸發(fā)器。
1.INSERT觸發(fā)器工作過程
當(dāng)試圖向表中插入記錄時,INSERT觸發(fā)器(如果有)自動執(zhí)行,此時系統(tǒng)自動創(chuàng)建一個inserted表,新的記錄被添加到觸發(fā)器表和inserted表。
觸發(fā)器可以檢查inserted表,確定是否執(zhí)行觸發(fā)器動作和如何執(zhí)行觸發(fā)器動作。
2.DELETE觸發(fā)器工作過程
當(dāng)試圖從表中刪除信息時,DELETE觸發(fā)器被觸發(fā),此時系統(tǒng)自動創(chuàng)建一個deleted表,被刪除的行被放置到這個特殊的表中。被刪除的行在觸發(fā)器表中將不再存在。因此,觸發(fā)器表和deleted表之間沒有共同的記錄。
3.UPDATE觸發(fā)器工作過程
UPDATE語句可以看成兩步,刪除一條舊記錄,插入一條新記錄。所以,UPDATE觸發(fā)器被觸發(fā)時,自動創(chuàng)建一個deleted表和一個inserted表,UPDATE語句使原始行移入deleted表,將更新行插入到inserted表中。
評論