資源描述:
《sqlserver2000觸發(fā)器》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、SQLServer2000觸發(fā)器一、簡介觸發(fā)器是一種特殊的存儲過程,類似于其它編程語言中的事件函數(shù),SQL?Serve2000?允許為?INSERT、UPDATE、DELETE?創(chuàng)建觸發(fā)器,當在表(視圖)中插入、更新、刪除記錄時,觸發(fā)一個或一系列?T-SQL?語句。兩大類:DML觸發(fā)器和DLL觸發(fā)器。1、優(yōu)缺點觸發(fā)器的主要作用就是其能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)的一致性。除此之外,觸發(fā)器還有其它許多不同的功能:<1>強化約束(Enforcerestriction) 觸發(fā)器能夠?qū)崿F(xiàn)比C
2、HECK語句更為復(fù)雜的約束。<2>跟蹤變化Auditingchanges 觸發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,從而不允許數(shù)據(jù)庫中未經(jīng)許可的指定更新和變化。<3>級聯(lián)運行(Cascadedoperation)?!∮|發(fā)器可以偵測數(shù)據(jù)庫內(nèi)的操作,并自動地級聯(lián)影響整個數(shù)據(jù)庫的各項內(nèi)容。例如,某個表上的觸發(fā)器中包含有對另外一個表的數(shù)據(jù)操作(如刪除,更新,插入)而該操作又導致該表上觸發(fā)器被觸發(fā)。<5>存儲過程的調(diào)用(Storedprocedureinvocation)?!榱隧憫?yīng)數(shù)據(jù)庫更新觸,發(fā)器可以調(diào)用一個或多個存儲過程,
3、甚至可以通過外部過程的調(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ā)器性能通常比較低。當運行觸發(fā)器時,系統(tǒng)處理的大部分時間花費在參照其它表的這一處理上,因為這些表既不在內(nèi)存中也不在數(shù)據(jù)庫設(shè)備上,而
4、刪除表和插入表總是位于內(nèi)存中。可見觸發(fā)器所參照的其它表的位置決定了操作要花費的時間長短。2、注意事項<1>在視圖上創(chuàng)建普通觸發(fā)器可能會出現(xiàn)“對象無效”的錯誤,實際上,我們不能在視圖上創(chuàng)建?FOR?觸發(fā)器,而應(yīng)該創(chuàng)建?INSTEAD?OF?觸發(fā)器。在?SQLServer2000?聯(lián)機叢書中,是沒有說觸發(fā)器不能在視圖上創(chuàng)建的,?并且在語法解釋中表明:在?CREATE?TRIGGER?的?ON?之后可以是視圖。?然而,事實似乎并不是如此,很多專家也說觸發(fā)器不能在視圖上創(chuàng)建。?我也專門作了測試,的確如此,不管是普通
5、視圖還是索引視圖,都無法在上面創(chuàng)建觸發(fā)器.?但是無可厚非的是:當在臨時表或系統(tǒng)表上創(chuàng)建觸發(fā)器時會遭到拒絕。<2>FOR?CREATE?TRIGGER?語句FOR?關(guān)鍵字之后可以跟?INSERT、UPDATE、DELETE?中的一個或多個,也就是說在其它情況下是不會觸發(fā)觸發(fā)器的,?包括?SELECT、TRUNCATE、WRITETEXT、UPDATETEXT。<3>Truncate與delete的區(qū)別:TRUNCATE?TABLE?和不帶?WHERE?的?DELETE?功能是一樣的,都是刪除表中的所有數(shù)據(jù),不
6、過?TRUNCATE?TABLE?速度更快,占用的日志更少,這是因為?TRUNCATE?TABLE?直接釋放數(shù)據(jù)頁并且在事務(wù)日志中也只記錄數(shù)據(jù)頁的釋放,而?DELETE?是一行一行地刪除,在事務(wù)日志中要記錄每一條記錄的刪除。?那么可不可以用?TRUNCATE?TABLE?代替不帶?WHERE?的?DELETE?呢?在以下情況是不行的:?1、要保留標識的情況下,不能用?TRUNCATE?TABLE,因為?TRUNCATE?TABLE?會重置標識。?2、需要使用觸發(fā)器的情況下,不能使用?TRUNCATE?TAB
7、LE?,它不會激發(fā)觸發(fā)器。?3、對于由?FOREIGN?KEY?約束引用的表(即主鍵所在的表,不是外鍵所在的表)不能使用?TRUNCATE?TABLE。?4、對于參與了索引視圖的表不能使用?TRUNCATE?TABLE?,注意指索引視圖,并非普通視圖。?二、觸發(fā)器常用功能操作<1>一個有趣的觸發(fā)器應(yīng)用:觸發(fā)器回滾觸發(fā)器內(nèi)部語句出錯時,前面對數(shù)據(jù)更改操作將會無效。?舉個例子,在表中插入數(shù)據(jù)時觸發(fā)觸發(fā)器,而觸發(fā)器內(nèi)部此時發(fā)生了運行時錯誤,那么將返回一個錯誤值,并且拒絕剛才的數(shù)據(jù)插入。?我們看到許多注冊系統(tǒng)在注冊
8、后都不能更改用戶名,但這多半是由應(yīng)用程序決定的,?如果直接打開數(shù)據(jù)庫表進行更改,同樣可以更改其用戶名,在觸發(fā)器中利用回滾就可以巧妙地實現(xiàn)無法更改用戶名。?CREATETRIGGERtrigger_nameON表名?FORupdate?ASif?update(userName)?rollback?transaction關(guān)鍵在最后兩句,其解釋為:如果更新了?userName?列,就回滾事務(wù)。?<2>不能在觸發(fā)器中使用