触发器

 

 


>[1]为什么需要触发器

use studb
go
if exists (select * from sysobjects where name = 'bank')
drop table bank
if exists (select * from sysobjects where name = 'transinfo')
drop table transinfo
create table bank
(
customername char(8) not null,
cardid char(10) not null,
currentmoney money not null
)
create table transinfo
(
cardid char(10) not null,
transtype char(4) not null,
transmoney money not null,
transdate datetime not null
)
go
alter table bank
  add constraint ck_currentmoney check(currentmoney>=1)
alter table transinfo
  add constraint df_transdate default(getdate()) for transdate
go
insert into bank (customername,cardid,currentmoney) value ('张三','001',1000)
insert into bank (customername,cardid,currentmoney) value ('李四','002',1)
insert into transinfo (cardid,transtype,transmoney) value ('001','支取',200)
select * from bank
select * from transinfo
go


……………………………………………………………………………………………………………………………………


>[2]创建INSERT触发器

use studb
go
if exists (select * from sysobjects where name = 'trigger_transinfo')
drop trigger trigger_transinfo
create trigger trigger_transinfo
on transinfo
for insert
as
declare @type char(4),@outmoney money
declare @mycardid char(10),@balance money
select @type = transtype,@outmoney = transmoney,@mycardid = cardid from inserted
if (@type = '支取')
  update bank set currentmoney = currentmoney - @outmoney
else
  update bank set currentmoney = currentmoney + @outmoney
where cardid = @mycardid
print '交易成功!交易金额:'+convert(varchar(20),@outmoney)
select @balance = currentmoney from bank where cardid = @mycardid
print '卡号' + @mycardid + '    余额:' + convert(varchar(20),@balance)
go
set nocount on   -----不显示T-SQL语句影响的行数
insert into transinfo (cardid,transtype,transmoney) values ('001','支取',200)
insert into transinfo (cardid,transtype,transmoney) values ('002','存入',50000)
select * from bank
select * from transinfo

 

……………………………………………………………………………………………………………………………………

 


>[3]创建DELETE触发器

use studb
go
if exists (select * from sysobjects where name = 'trigger_delete_transinfo')
drop trigger trigger_delete_transinfo
create trigger trigger_delete_transinfo
on transinfo
for delete
as
print '开始备份数据,请稍后。。。'
if not exists (select * from sysobject where name = 'backuptable')
  select * into backuptable from deleted
else
  insert into backuptable select * from deleted
print '备份数据成功,备份表中的数据为:'
select * from backuptable
go
set nocount on
delete transinfo
print '交易信息表中的数据:'
select * from transinfo


……………………………………………………………………………………………………………………………………


>[4]创建UPDATE触发器

use studb
go
if exists (select * from sysobjects where name = 'trigger_update_bank')
drop trigger trigger_update_bank
create trigger trigger_update_bank
on bank
for update
as
declare @beforemoney money,@aftermoney money
select @beforemoney = currentmoney from deleted
select @aftermoney = currentmoney from inserted
if abs(@aftermoney - @beforemoney)>20000
  begin
    print '交易金额:'+convert(varchar(20),abs(@aftermoney-@beforemoney))
    raiserror ('每笔交易不能超过2万元,交易失败',16,1)
    rollback transaction
  end
go
set nocount on
update bank set currentmoney = currentmoney + 25000 where cardid = '001'
insert into transinfo (cardid,transtype,transmoeny) values ('002','支取',30000)
insert into transinfo (cardid,transtype,transmoeny) values ('002','存入',5000)
go
print '帐户信息表中的数据:'
select * from bank
print '交易信息表中的数据:'
select * from transinfo


use studb
go
if exists (select * from sysobjects where name = 'trigger_update_transinfo')
drop trigger trigger_update_transinfo
go
create trigger trigger_update_transinfo
on transinfo
for update
as
if update (transdate)   ------检查是否修改了交易日期列
  begin
    print '交易失败。。。'
    raiserror ('安全警告:交易日期不能修改,由系统自动产生',16,1)
    rollback transaction
  end
go
set nocount on
update transdate set transdate = '2000-1-1'
go

posted on 2010-04-17 19:42  记住昨天,迎接明天  阅读(227)  评论(0编辑  收藏  举报