不知不覺講到觸發器了,一般我們做程序的很少接觸到觸發器,觸發器的操作一般是DB人員來完成。
然而有的時候一些簡單的業務需要我們自己去完成,不能每次都去麻煩DB人員,所以說,編程人員要全才,除了編程以為的專業知識也要涉獵,比如js,css,html,t-sql等一些語法,不一定要去精通,但是要熟悉,至少語法可以看懂,這樣對我們的編程有事半功倍的效果,出現異常錯誤,我們也方便調試,以便最快找出錯誤。
言歸正傳,什么事觸發器,顧名思義,就是你做一個操作,就會觸發另一個事件,去執行一些操作。
比如你點煙花,點是一個動作,煙花是另一個動作,點動作完成就會觸發煙花這個動作。
還有就是觸發器必須依附一個主體,比如依附于某一張表,就像編程中事件這個概念。
下面我們通過一個簡單的實例,和大家一步一步的來理解和運用觸發器。
實例要求:
1,建商品表(Store),訂單表(orders),日志表(Logs)
2, 創建訂單表插入觸發器 ,實現插入一條訂單信息,商品表中商品數量相應減少,訂單中的總金額相應增加。
3, 創建訂單表更新觸發器,實現更新一條訂單信息,商品表中商品數量相應變化,訂單中的總金額相應變化。(和2類似)
4,創建日志表觸發器,實現更新商品表價格變化情況。
1,創建 商品表(Store),訂單表(orders),日志表(Logs)
第一步沒什么講解,我們創建表,并加一些示例數據。
示例代碼:
1 create table Store 2 ( 3 ID uniqueidentifier primary key , 4 ProductID int not null , 5 ProductPrice money not null default 1 , 6 ProductCH nvarchar ( 80 ) not null , 7 ProductDate datetime not null , 8 NowNumber int not null 9 ); 10 create table orders 11 ( 12 OrderID int primary key , 13 ProductID int not null , 14 BuyNumber int Not null default 1 , 15 BuyPricr money not null , 16 NowOrderPrice money default 0 17 ) 18 create table Logs 19 ( 20 ID uniqueidentifier primary key , 21 operatedatetime datetime , 22 ProductID int , 23 oldprice money , 24 newprice money 25 ); 26 27 insert into dbo.Store 28 values ( NEWID (), 1001 , 5000 , ' 聯想 ' , ' 2011-9-1 ' , 50 ) 29 insert into dbo.Store 30 values ( NEWID (), 1002 , 6000 , ' apple ' , ' 2011-9-1 ' , 50 ) 31 insert into dbo.orders(OrderID,ProductID,BuyNumber,BuyPricr) 32 values ( 10013 , 1001 , 5 , 6000 )
2,創建訂單表觸發器
要求2,3類似操作我在一起講解了。
先看示例代碼:
1 create trigger tri_order_NowOrderPrice 2 on orders after insert 3 as 4 begin 5 declare @NowOrderPrice money ; 6 declare @BuyNumber int ; 7 declare @ProductID int ; 8 select @ProductID = ProductID, @BuyNumber = BuyNumber from inserted; 9 select @NowOrderPrice = inserted.BuyNumber * inserted.BuyPricr from inserted; 10 update orders set NowOrderPrice = @NowOrderPrice where ProductID = @ProductID ; 11 update Store set NowNumber = NowNumber - @BuyNumber where ProductID = @ProductID ; 12 end ; 13 14 create trigger tri_store_NowOrderPrice2 15 on orders after update 16 as 17 begin 18 declare @NowOrderPrice money ; 19 declare @ProductID int ; 20 declare @BuyNumber1 int ; 21 declare @BuyNumber2 int ; 22 select @ProductID = ProductID from inserted; 23 select @BuyNumber1 = BuyNumber from inserted; 24 select @NowOrderPrice = inserted.BuyNumber * inserted.BuyPricr from inserted; 25 select @BuyNumber2 = deleted.BuyNumber from deleted where ProductID = @ProductID ; 26 update orders set NowOrderPrice = @NowOrderPrice where ProductID = @ProductID ; 27 update Store set NowNumber = NowNumber - ( @BuyNumber1 - @BuyNumber2 ) where ProductID = @ProductID ; 28 end ;
觸發器的關鍵字是trigger,語法是,on 表名 after 操作名稱(一般為insert,update,delete),begin end中寫一些觸發器的處理操作。
inserted獲取insert之后的數據。語法就是這么簡單。
3,創建日志表觸發器
日志表觸發器要做的操作就是記錄商品價格變化,那對應就應該在商品表中創建觸發器。
示例代碼:
1 create trigger tri_NowOrderPrice4 2 on dbo.Store after insert , update , delete 3 as 4 begin 5 if exists ( select * from inserted) and exists ( select * from deleted) 6 begin 7 print ( ' update ' ); 8 declare @price1 money ; 9 declare @price2 money ; 10 declare @datetime datetime ; 11 select @price1 = ProductPrice from deleted; 12 select @price2 = ProductPrice from inserted; 13 if @price1 != @price2 14 begin 15 declare @ProductID int ; 16 select @ProductID = ProductID from inserted 17 insert into Logs(ID,operatedatetime,ProductID,oldprice,newprice) 18 values ( newid (), convert ( datetime , getdate ()), @ProductID , @price1 , @price2 ) 19 20 select * from dbo.Logs 21 end 22 end 23 else if exists ( select * from inserted) 24 begin 25 print ( ' insert ' ); 26 end 27 else if exists ( select * from deleted) 28 begin 29 print ( ' delete ' ); 30 end 31 else 32 begin 33 print ( ' others ' ); 34 end 35 end
觸發器就是這些內容,有關觸發器的 一些 復雜操作希望大家有時間研究下,講的不好請大家多多指正,希望大家學好t-sql語言。
以后繼續整理編程相關內容,希望大家多多關注。。。。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
