簡單觸發(fā)器的使用 獻給SQL初學(xué)者
更新時間:2011年09月13日 21:51:24 作者:
簡單觸發(fā)器的使用 獻給SQL初學(xué)者,使用sqlserver的朋友可以參考下。
首先,啰嗦幾句廢話如下:
(1)觸發(fā)器(trigger)是個特殊的存儲過程,它的執(zhí)行并不需要我們?nèi)ワ@式調(diào)用,而是由一些事件觸發(fā),這有點類似C#中的事件處理機制。當使用UPDATE,INSERT 或DELETE的一種或多種對指定的數(shù)據(jù)庫的相關(guān)表進行操作時,會觸發(fā)觸發(fā)器。
(2)觸發(fā)器可以包含復(fù)雜的SQL語句,主要用于強制復(fù)雜的業(yè)務(wù)規(guī)則或要求。
?。?)觸發(fā)器能夠維持數(shù)據(jù)庫的完整性,當執(zhí)行插入、更新或刪除操作時,觸發(fā)器會根據(jù)表與表之間的關(guān)系,強制保持其數(shù)據(jù)的完整性。
好,啰嗦完了開始貼代碼,首先貼上我創(chuàng)建的兩張表所包含的列,他們的關(guān)聯(lián)關(guān)系是1對多,以UserID進行關(guān)聯(lián)。
然后來一個非常簡單的觸發(fā)器
IF EXISTS(SELECT * FROM sysobjects
WHERE name='tr_Users_OnUpdate' AND TYPE='TR')
DROP TRIGGER tr_Users_OnUpdate
GO --這里呢創(chuàng)建觸發(fā)器與存儲過程類似(都是DDL)
--先判斷如否存在同名觸發(fā)器就刪除然后重建
CREATE TRIGGER tr_Users_OnUpdate
ON Users FOR UPDATE
AS PRINT ‘Users表已發(fā)生修改'
GO
上述代碼中,tr_Users_OnUpdate為觸發(fā)器名稱,Users為表名。這觸發(fā)器的作用是當向Users表執(zhí)行Update時將打印“Users表已發(fā)生修改”。
好了我們可以看到這個觸發(fā)器的實用性不是很大,那么接下來呢我們再來學(xué)習(xí)下關(guān)于觸發(fā)器里兩種特殊的表“inserted”和“deleted”。這兩張表主要用于觸發(fā)器。Deleted 表用于存儲 執(zhí)行DELETE 和 UPDATE操作時所影響的行的副本。而Inserted 表則用于存儲 INSERT 和 UPDATE 語句所影響的行的副本。那么我們看到執(zhí)行UPDATE操作時都會有記錄分別存儲到“inserted”和“deleted”。其實理解起來不難deleted表存儲的是Update之前的記錄,而inserted存儲的呢則是Update之后的記錄,這里關(guān)于理論性東西我不再贅述,官方資料有更詳細說明。
現(xiàn)在我們要做的就是本文的重點,當往WordInfo添加一條記錄時,使用觸發(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表即可。
(1)觸發(fā)器(trigger)是個特殊的存儲過程,它的執(zhí)行并不需要我們?nèi)ワ@式調(diào)用,而是由一些事件觸發(fā),這有點類似C#中的事件處理機制。當使用UPDATE,INSERT 或DELETE的一種或多種對指定的數(shù)據(jù)庫的相關(guān)表進行操作時,會觸發(fā)觸發(fā)器。
(2)觸發(fā)器可以包含復(fù)雜的SQL語句,主要用于強制復(fù)雜的業(yè)務(wù)規(guī)則或要求。
?。?)觸發(fā)器能夠維持數(shù)據(jù)庫的完整性,當執(zhí)行插入、更新或刪除操作時,觸發(fā)器會根據(jù)表與表之間的關(guān)系,強制保持其數(shù)據(jù)的完整性。
好,啰嗦完了開始貼代碼,首先貼上我創(chuàng)建的兩張表所包含的列,他們的關(guān)聯(lián)關(guān)系是1對多,以UserID進行關(guān)聯(lián)。

然后來一個非常簡單的觸發(fā)器
復(fù)制代碼 代碼如下:
IF EXISTS(SELECT * FROM sysobjects
WHERE name='tr_Users_OnUpdate' AND TYPE='TR')
DROP TRIGGER tr_Users_OnUpdate
GO --這里呢創(chuàng)建觸發(fā)器與存儲過程類似(都是DDL)
--先判斷如否存在同名觸發(fā)器就刪除然后重建
CREATE TRIGGER tr_Users_OnUpdate
ON Users FOR UPDATE
AS PRINT ‘Users表已發(fā)生修改'
GO
上述代碼中,tr_Users_OnUpdate為觸發(fā)器名稱,Users為表名。這觸發(fā)器的作用是當向Users表執(zhí)行Update時將打印“Users表已發(fā)生修改”。
好了我們可以看到這個觸發(fā)器的實用性不是很大,那么接下來呢我們再來學(xué)習(xí)下關(guān)于觸發(fā)器里兩種特殊的表“inserted”和“deleted”。這兩張表主要用于觸發(fā)器。Deleted 表用于存儲 執(zhí)行DELETE 和 UPDATE操作時所影響的行的副本。而Inserted 表則用于存儲 INSERT 和 UPDATE 語句所影響的行的副本。那么我們看到執(zhí)行UPDATE操作時都會有記錄分別存儲到“inserted”和“deleted”。其實理解起來不難deleted表存儲的是Update之前的記錄,而inserted存儲的呢則是Update之后的記錄,這里關(guān)于理論性東西我不再贅述,官方資料有更詳細說明。
現(xiàn)在我們要做的就是本文的重點,當往WordInfo添加一條記錄時,使用觸發(fā)器使UserInfo的相應(yīng)記錄的LeaveCount字段增加1。代碼如下:
復(fù)制代碼 代碼如下:
--添加留言的觸發(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)文章
SQL?Server?2008?R2安裝教程及錯誤解決方案詳細教程
這篇文章主要介紹了安裝SQL?Server?2008?R2的步驟,并列舉了幾個常見的錯誤及其解決方法,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2025-02-02
MSSQL內(nèi)外連接(INNER JOIN)語句詳解
這幾天重新溫習(xí)了一下SQL的書本,現(xiàn)在的思路應(yīng)該是很清楚了,現(xiàn)在把自己的理解發(fā)出來給大家溫習(xí)下。希望和我一樣對SQL的連接語句不太理解的朋友能夠有所幫助2006-11-11
SQL語句的各個關(guān)鍵字的解析過程詳細總結(jié)
由于最近需要做一些sql query性能提升的研究,因此研究了一下sql語句的解析過程;本文是我在看了各種資料后手機總結(jié)的,會詳細的,一步一步的講述一個sql語句的各個關(guān)鍵字的解析過程,歡迎大家互相學(xué)習(xí)2013-01-01

