不知不觉讲到触发器了,一般我们做程序的很少接触到触发器,触发器的操作一般是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语言。
以后继续整理编程相关内容,希望大家多多关注。。。。

