簡(jiǎn)單觸發(fā)器的使用 獻(xiàn)給SQL初學(xué)者
?。?)觸發(fā)器(trigger)是個(gè)特殊的存儲(chǔ)過程,它的執(zhí)行并不需要我們?nèi)ワ@式調(diào)用,而是由一些事件觸發(fā),這有點(diǎn)類似C#中的事件處理機(jī)制。當(dāng)使用UPDATE,INSERT 或DELETE的一種或多種對(duì)指定的數(shù)據(jù)庫(kù)的相關(guān)表進(jìn)行操作時(shí),會(huì)觸發(fā)觸發(fā)器。
?。?)觸發(fā)器可以包含復(fù)雜的SQL語(yǔ)句,主要用于強(qiáng)制復(fù)雜的業(yè)務(wù)規(guī)則或要求。
?。?)觸發(fā)器能夠維持?jǐn)?shù)據(jù)庫(kù)的完整性,當(dāng)執(zhí)行插入、更新或刪除操作時(shí),觸發(fā)器會(huì)根據(jù)表與表之間的關(guān)系,強(qiáng)制保持其數(shù)據(jù)的完整性。
好,啰嗦完了開始貼代碼,首先貼上我創(chuàng)建的兩張表所包含的列,他們的關(guān)聯(lián)關(guān)系是1對(duì)多,以UserID進(jìn)行關(guān)聯(lián)。
然后來(lái)一個(gè)非常簡(jiǎn)單的觸發(fā)器
IF EXISTS(SELECT * FROM sysobjects
WHERE name='tr_Users_OnUpdate' AND TYPE='TR')
DROP TRIGGER tr_Users_OnUpdate
GO --這里呢創(chuàng)建觸發(fā)器與存儲(chǔ)過程類似(都是DDL)
--先判斷如否存在同名觸發(fā)器就刪除然后重建
CREATE TRIGGER tr_Users_OnUpdate
ON Users FOR UPDATE
AS PRINT ‘Users表已發(fā)生修改'
GO
上述代碼中,tr_Users_OnUpdate為觸發(fā)器名稱,Users為表名。這觸發(fā)器的作用是當(dāng)向Users表執(zhí)行Update時(shí)將打印“Users表已發(fā)生修改”。
好了我們可以看到這個(gè)觸發(fā)器的實(shí)用性不是很大,那么接下來(lái)呢我們?cè)賮?lái)學(xué)習(xí)下關(guān)于觸發(fā)器里兩種特殊的表“inserted”和“deleted”。這兩張表主要用于觸發(fā)器。Deleted 表用于存儲(chǔ) 執(zhí)行DELETE 和 UPDATE操作時(shí)所影響的行的副本。而Inserted 表則用于存儲(chǔ) INSERT 和 UPDATE 語(yǔ)句所影響的行的副本。那么我們看到執(zhí)行UPDATE操作時(shí)都會(huì)有記錄分別存儲(chǔ)到“inserted”和“deleted”。其實(shí)理解起來(lái)不難deleted表存儲(chǔ)的是Update之前的記錄,而inserted存儲(chǔ)的呢則是Update之后的記錄,這里關(guān)于理論性東西我不再贅述,官方資料有更詳細(xì)說(shuō)明。
現(xiàn)在我們要做的就是本文的重點(diǎn),當(dāng)往WordInfo添加一條記錄時(shí),使用觸發(fā)器使UserInfo的相應(yīng)記錄的LeaveCount字段增加1。代碼如下:
--添加留言的觸發(fā)器
IF EXISTS(SELECT name FROM sysobjects WHERE name='tr_LeaveWord_Add' AND TYPE='TR')
DROP TRIGGER tr_LeaveWord_Add
GO
CREATE TRIGGER tr_LeaveWord_Add
ON WordInfo FOR INSERT
AS UPDATE UserInfo SET LeaveCount=LeaveCount+1
WHERE UserID=(SELECT TOP 1 UserID FROM Inserted)
GO
OK,到這里就可以收工了,值得注意的是如果觸發(fā)器是UPDATE觸發(fā)的,那么在執(zhí)行Update后再查詢更新之前的數(shù)據(jù)改成查詢deleted表即可。
相關(guān)文章
MSSQL MySQL 數(shù)據(jù)庫(kù)分頁(yè)(存儲(chǔ)過程)
有關(guān)分頁(yè) SQL 的資料很多,有的使用存儲(chǔ)過程,有的使用游標(biāo)。本人不喜歡使用游標(biāo),我覺得它耗資、效率低;使用存儲(chǔ)過程是個(gè)不錯(cuò)的選擇,因?yàn)榇鎯?chǔ)過程是經(jīng)過預(yù)編譯的,執(zhí)行效率高,也更靈活2012-01-01SQL恢復(fù)master數(shù)據(jù)庫(kù)方法 只有mdf文件的數(shù)據(jù)庫(kù)如何恢復(fù)
這篇文章主要為大家詳細(xì)介紹了SQL恢復(fù)master數(shù)據(jù)庫(kù)方法,還分析了只有mdf文件的數(shù)據(jù)庫(kù)如何進(jìn)行恢復(fù)的情況,也就是沒有l(wèi)og文件的數(shù)據(jù)庫(kù)文件恢復(fù)方法,感興趣的小伙伴們可以參考一下2016-05-05MSSQL優(yōu)化之探索MSSQL執(zhí)行計(jì)劃(轉(zhuǎn))
最近總想整理下對(duì)MSSQL的一些理解與感悟,卻一直沒有心思和時(shí)間寫,晚上無(wú)事便寫了一篇探索MSSQL執(zhí)行計(jì)劃,本文講執(zhí)行計(jì)劃但不僅限于講執(zhí)行計(jì)劃2011-10-10SQL Server免費(fèi)版的安裝以及使用SQL Server Management Studio(SSMS)連接數(shù)據(jù)庫(kù)的
這篇文章主要介紹了SQL Server免費(fèi)版的安裝以及使用SQL Server Management Studio(SSMS)連接數(shù)據(jù)庫(kù)的圖文方法,需要的朋友可以參考下2020-02-02SQL?Server創(chuàng)建用戶定義函數(shù)
這篇文章介紹了SQL?Server創(chuàng)建用戶定義函數(shù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05小米正式開源 SQL 智能優(yōu)化與改寫工具 SOAR
SOAR,即 SQL Optimizer And Rewriter,是一款 SQL 智能優(yōu)化與改寫工具,由小米運(yùn)維 DBA 團(tuán)隊(duì)出品。下面通過本文給大家分享小米正式開源 SQL 智能優(yōu)化與改寫工具 SOAR,感興趣的朋友一起看看吧2018-11-11SQLServer性能優(yōu)化--間接實(shí)現(xiàn)函數(shù)索引或者Hash索引
本文主要介紹了SQLServer性能優(yōu)化--間接實(shí)現(xiàn)函數(shù)索引或者Hash索引的解決方式。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03