資源描述:
《sqlserver數(shù)據(jù)庫中使用觸發(fā)器經(jīng)驗談》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、SQLServer數(shù)據(jù)庫中使用觸發(fā)器經(jīng)驗談>>教育資源庫 本文通過講解觸發(fā)器的使用,其中重要的是理解inserted過程。當(dāng)在定義有觸發(fā)器的表上執(zhí)行UPDATE語句時,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。觸發(fā)器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執(zhí)行觸發(fā)器動作?! ∮|發(fā)器是數(shù)據(jù)庫應(yīng)用中的重用工具,它的應(yīng)用很廣泛。這幾天寫一個化學(xué)數(shù)據(jù)統(tǒng)計方面的軟件,需要根據(jù)采樣,自動計算方差,在這里,我使用了觸發(fā)器??梢远x一個無論何時用INSERT語句向表中插入數(shù)據(jù)時
2、都會執(zhí)行的觸發(fā)器。當(dāng)觸發(fā)INSERT觸發(fā)器時,新的數(shù)據(jù)行就會被插入到觸發(fā)器表和inserted表中。inserted表是一個邏輯表,它包含了已經(jīng)插入的數(shù)據(jù)行的一個副本。inserted表包含了INSERT語句中已記錄的插入動作。inserted表還允許引用由初始化INSERT語句而產(chǎn)生的日志數(shù)據(jù)。觸發(fā)器通過檢查inserted表來確定是否執(zhí)行觸發(fā)器動作或如何執(zhí)行它。inserted表中的行總是觸發(fā)器表中一行或多行的副本。 日志記錄了所有修改數(shù)據(jù)的動作(INSERT、UPDATE和DELETE語句),但在事務(wù)日志中的信息是不可讀的。然而,inse
3、rted表允許你引用由INSERT語句引起的日志變化,這樣就可以將插入數(shù)據(jù)與發(fā)生的變化進(jìn)行比較,來驗證它們或采取進(jìn)一步的動作。也可以直接引用插入的數(shù)據(jù),而不必將它們存儲到變量中。 示例 在本例中,將創(chuàng)建一個觸發(fā)器。無論何時訂購產(chǎn)品(無論何時向OrderDetails表中插入一條記錄),這個觸發(fā)器都將更新Products表中的一列(UnitsInStock)。用原來的值減去訂購的數(shù)量值即為新值。USENorthage)的DELETE語句,和捕獲數(shù)據(jù)后像(afterimage)的INSERT語句。當(dāng)在定義有觸發(fā)器的表上執(zhí)行UPDATE語句時,原始
4、行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。 觸發(fā)器檢查deleted表和inserted表以及被更新的表,來確定是否更新了多行以及如何執(zhí)行觸發(fā)器動作?! 】梢允褂肐FUPDATE語句定義一個監(jiān)視指定列的數(shù)據(jù)更新的觸發(fā)器。這樣,就可以讓觸發(fā)器容易的隔離出特定列的活動。當(dāng)它檢測到指定列已經(jīng)更新時,觸發(fā)器就會進(jìn)一步執(zhí)行適當(dāng)?shù)膭幼?,例如發(fā)出錯誤信息指出該列不能更新,或者根據(jù)新的更新的列值執(zhí)行一系列的動作語句。 語法IFUPDATE(<column_name>) 例1 本例阻止用戶修改Employee
5、s表中的EmployeeID列。USENorthployee_UpdateONEmployeesFORUPDATEASIFUPDATE(EmployeeID)BEGINRAISERROR('Transactioncannotbeprocessed.*****EmployeeIDnumbercannotbemodified.',10,1)ROLLBACKTRANSACTIONEND INSTEADOF觸發(fā)器的工作過程 可以在表或視圖上指定INSTEADOF觸發(fā)器。執(zhí)行這種觸發(fā)器就能夠替代原始的觸發(fā)動作。INSTEADOF觸發(fā)器擴
6、展了視圖更新的類型。對于每一種觸發(fā)動作(INSERT、UPDATE或DELETE),每一個表或視圖只能有一個INSTEADOF觸發(fā)器?! NSTEADOF觸發(fā)器被用于更新那些沒有辦法通過正常方式更新的視圖。例如,通常不能在一個基于連接的視圖上進(jìn)行DELETE操作。然而,可以編寫一個INSTEADOFDELETE觸發(fā)器來實現(xiàn)刪除。上述觸發(fā)器可以訪問那些如果視圖是一個真正的表時已經(jīng)被刪除的數(shù)據(jù)行。將被刪除的行存儲在一個名為deleted的工作表中,就像AFTER觸發(fā)器一樣。相似地,在UPDATEINSTEADOF觸發(fā)器或者12下一頁>>>>這篇文章
7、來自..,。INSERTINSTEADOF觸發(fā)器中,你可以訪問inserted表中的新行?! 〔荒茉趲в蠧ustomersexFROMCustomersexico'GO 在該數(shù)據(jù)上創(chuàng)建視圖:CREATEVIECustomersMexGO 創(chuàng)建一個在上述視圖上的INSTEADOF觸發(fā)器:CREATETRIGGERCustomers_Update2ONCustomersVieany'BEGINUPDATECustomersGerSETCustomersGer.Phone=Inserted.PhoneFROMCustomersGer
8、JOINInsertedONCustomersGer.CustomerID=Inserted.CustomerIDENDELSEIFCo