不知不覺講到觸發器了,一般我們做程序的很少接觸到觸發器,觸發器的操作一般是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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

