赞
踩
--测试数据库
use master
go
drop database Bank
go
create database Bank
go
use Bank
go
create table Cards
(
cardNum varchar(19) primary key ,
userName varchar(50) not null,
balance money default(0) check(balance>=0) not null
)
go
create table TransInfo
(
cardNum varchar(19) references Cards(cardNum) not null,
transType varchar(4) check(transType in ('存款','取款')) not null,
transMoney money not null check(transMoney>=0),
transDate datetime default(getdate()) not null
)
go
insert into Cards values('1234 5678 1234 5678','张三',1500)
insert into Cards values('1234 5678 4321 6666','李四',1500)
--首先介绍插入触发器insert
create trigger transInfo_Insert
on TransInfo for insert
as
declare @cardNum varchar(19),
@transType varchar(4),
@transMoney money
select @cardNum=cardNum,@transType=transType,@transMoney=transMoney from inserted--插入临时表,保存当前插入该表的数据
if(@transType='存款')
begin
update Cards set balance=balance+@transMoney where cardNum=@cardNum
end
else
begin
update Cards set balance=balance-@transMoney where cardNum=@cardNum
end
go
--当我们向TransInfo插入数据时,数据库服务器将会自动调用transInfo_Insert触发器并执行。
--触发器的特点:、无法手动调用。、本身就是一个特殊的存储过程并且自身具备一个事务。、如果想插入数据失败,可以使用rollback进行回滚。
--4、该触发器的事务是从启动时开启,结束时自动提交。
insert into TransInfo values('1234 5678 4321 6666','取款',300,default)
insert into TransInfo values('1234 5678 4321 6666','存款',200,default)
--运行完查看结果
select * from transinfo
select * from cards
---------------------------------------------------------------------------------------------
--测试数据库
use master
go
drop database Bank
go
create database Bank
go
use Bank
go
create table Cards
(
cardNum varchar(19) primary key ,
userName varchar(50) not null,
balance money default(0) check(balance>=0) not null
)
go
create table TransInfo
(
cardNum varchar(19) references Cards(cardNum) not null,
transType varchar(4) check(transType in ('存款','取款')) not null,
transMoney money not null check(transMoney>=0),
transDate datetime default(getdate()) not null
)
go
insert into Cards values('1234 5678 1234 5678','张三',1500)
insert into Cards values('1234 5678 4321 6666','李四',1000)
insert into TransInfo values('1234 5678 4321 6666','取款',300,default)
insert into TransInfo values('1234 5678 4321 6666','存款',200,default)
go
--创建删除触发器
create trigger TransInfo_Delete--触发器名称
on TransInfo for delete--on 表名for 触发器类型
as
declare @cardNum varchar(19),
@transType varchar(4),
@transMoney money
if exists(select id from sysobjects where [name]='bak_transinfo')
insert into bak_transinfo select * from deleted
else
select * into bak_transinfo from deleted
go
--在删除触发器中存在的是deleted临时表,当中保存了删除该表的所有数据,直到触发器执行完毕时删除。
--测试操作
delete from transinfo where cardNum='1234 5678 4321 6666'
--运行完查看结果
select * from transinfo
select * from cards
---------------------------------------------------------------------------------------------
--创建update更新触发器
create trigger TransInfo_Update
on TransInfo for update
as
--在更新触发器中存在两张临时表inserted和deleted
--因为在更新操作中,原理也就是将原来的该行数据删除,然后在插入新的行数据
if update(transmoney) --使用update(列名)可以判断指定列是否有进行数据的更新
print '金额更新了!'
else
print '金额没有更新!'
--通过以上的操作可以验证转账金额
go
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。