文章出處

  不知不覺講到觸發器了,一般我們做程序的很少接觸到觸發器,觸發器的操作一般是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語言。

  以后繼續整理編程相關內容,希望大家多多關注。。。。

  


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()