資源描述:
《sqlserver2000中的觸發(fā)器使用》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、SQLServer2000中的觸發(fā)器使用>>教育資源庫觸發(fā)器是數(shù)據(jù)庫應(yīng)用中的重用工具,它的應(yīng)用很廣泛。這幾天寫一個(gè)化學(xué)數(shù)據(jù)統(tǒng)計(jì)方面的軟件,需要根據(jù)采樣,自動(dòng)計(jì)算方差,在這里,我使用了觸發(fā)器?! ∠旅嫖艺浟薙QLServer官方教程中的一段關(guān)于觸發(fā)器的文字,確實(shí)有用的一點(diǎn)文字描述?! 】梢远x一個(gè)無論何時(shí)用INSERT語句向表中插入數(shù)據(jù)時(shí)都會(huì)執(zhí)行的觸發(fā)器?! ‘?dāng)觸發(fā)INSERT觸發(fā)器時(shí),新的數(shù)據(jù)行就會(huì)被插入到觸發(fā)器表和inserted表中。inserted表是一個(gè)邏輯表,它包含了已經(jīng)插入的數(shù)據(jù)行的一個(gè)副本。inserted表包含了INSERT語句中已記錄的插入動(dòng)作。insert
2、ed表還允許引用由初始化INSERT語句而產(chǎn)生的日志數(shù)據(jù)。觸發(fā)器通過檢查inserted表來確定是否執(zhí)行觸發(fā)器動(dòng)作或如何執(zhí)行它。inserted表中的行總是觸發(fā)器表中一行或多行的副本?! ∪罩居涗浟怂行薷臄?shù)據(jù)的動(dòng)作(INSERT、UPDATE和DELETE語句),但在事務(wù)日志中的信息是不可讀的。然而,inserted表允許你引用由INSERT語句引起的日志變化,這樣就可以將插入數(shù)據(jù)與發(fā)生的變化進(jìn)行比較,來驗(yàn)證它們或采取進(jìn)一步的動(dòng)作。也可以直接引用插入的數(shù)據(jù),而不必將它們存儲(chǔ)到變量中?! ∈纠 ≡诒纠校瑢?chuàng)建一個(gè)觸發(fā)器。無論何時(shí)訂購產(chǎn)品(無論何時(shí)向OrderDetails表
3、中插入一條記錄),這個(gè)觸發(fā)器都將更新Products表中的一列(UnitsInStock)。用原來的值減去訂購的數(shù)量值即為新值。USENorthiddot;當(dāng)某行被添加到deleted表中時(shí),它就不再存在于數(shù)據(jù)庫表中;因此,deleted表和數(shù)據(jù)庫表沒有相同的行?! ?chuàng)建deleted表時(shí),空間是從內(nèi)存中分配的。deleted表總是被存儲(chǔ)在高速緩存中?! 镈ELETE動(dòng)作定義的觸發(fā)器并不執(zhí)行TRUNCATETABLE語句,原因在于日志不記錄TRUNCATETABLE語句?! ∈纠 ≡诒纠?,將創(chuàng)建一個(gè)觸發(fā)器,無論何時(shí)刪除一個(gè)產(chǎn)品類別(即從Categories表中刪除一條記錄
4、),該觸發(fā)器都會(huì)更新Products表中的Discontinued列。所有受影響的產(chǎn)品都標(biāo)記為1,標(biāo)示不再使用這些產(chǎn)品了。USENorthage)的DELETE語句,和捕獲數(shù)據(jù)后像(afterimage)的INSERT語句。當(dāng)在定義有觸發(fā)器的表上執(zhí)行UPDATE語句時(shí),原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表?! ∮|發(fā)器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執(zhí)行觸發(fā)器動(dòng)作?! 】梢允褂肐FUPDATE語句定義一個(gè)監(jiān)視指定列的數(shù)據(jù)更新的觸發(fā)器。這樣,就可以讓觸發(fā)器容易的隔離出特定列的活動(dòng)。當(dāng)它檢
5、測(cè)到指定列已經(jīng)更新時(shí),觸發(fā)器就會(huì)進(jìn)一步執(zhí)行適當(dāng)?shù)膭?dòng)作,例如發(fā)出錯(cuò)誤信息指出該列不能更新,或者根據(jù)新的更新的列值執(zhí)行一系列的動(dòng)作語句?! ≌Z法IFUPDATE(<column_name>) 例1 本例阻止用戶修改Employees表中的EmployeeID列。USENorthployee_UpdateONEmployeesFORUPDATEASIFUPDATE(EmployeeID)BEGINRAISERROR('Transactioncannotbeprocessed.*****EmployeeIDnumbercannotbemodified.'
6、;,10,1)ROLLBACKTRANSACTIONEND INSTEADOF觸發(fā)器的工作過程 可以在表或視圖上指定INSTEADOF觸發(fā)器。執(zhí)行這種觸發(fā)器就能夠替代原始的觸發(fā)動(dòng)作。INSTEADOF觸發(fā)器擴(kuò)展了視圖更新的類型。對(duì)于每一種觸發(fā)動(dòng)作(INSERT、UPDATE或DELETE),每一個(gè)表或視圖只能有一個(gè)INSTEADOF觸發(fā)器。 INSTEADOF觸發(fā)器被用于更新那些沒有辦法通過正常方式更新的視圖。例如,通常不能在一個(gè)基于連接的視圖上進(jìn)行DELETE操作。然而,可以編寫一個(gè)INSTEADOFDELETE觸發(fā)器來實(shí)現(xiàn)刪除。上述觸發(fā)器可以訪問那些如果視圖是一個(gè)
7、真正的表時(shí)已經(jīng)被刪除的數(shù)據(jù)行。將被刪除的行存儲(chǔ)在一個(gè)名為deleted的工作表中,就像AFTER觸發(fā)器一樣。相似地,在UPDATEINSTEADOF觸發(fā)器或者INSERTINSTEADOF觸發(fā)器中,你可以訪問inserted表中的新行。 不能在帶有WITHCHECKOPTION定義的視圖中創(chuàng)建INSTEADOF觸發(fā)器。 示例>>>這篇文章來自..,。> 在本例中,創(chuàng)建了一個(gè)德國客戶表和一個(gè)墨西哥客戶表。放置在視圖上的INSTEADOF觸發(fā)器將把更新操作重新定向到適當(dāng)?shù)幕砩稀_@時(shí)發(fā)生的