use stuDB
go
--创建帐户信息表 bank 和交易信息表 transInfo
if exists(select * from sysobjects where name='bank')
drop table bank
if exists(select * from sysobjects where name='transInfo')
drop table transInfo
go
create table bank --帐户信息表
(
customerName char(8) not null, --顾客姓名
cardID char(10) not null, --卡号
currentMoney money not null --当前余额
)
go
create table transInfo --交易信息表
(
cardID char(10) not null, --卡号
transType char(4) not null, --交易类型(存入/支取)
transMoney money not null, --交易金额
transDate datetime not null --交易日期
)
go
/*----添加约束:帐户余额不能少于1元,交易日期默认为当天日期----*/
alter table bank add constraint CK_currentMoney check(currentMoney>=1)
alter table transInfo add constraint DF_transDate default (getDate()) for transDate
go
/*---删除约束---*/
alter table bank drop constraint CK_currentMoney
alter table transInfo drop constraint DF_transDate
/*---插入测试数据:张三开户,开户金额为800,李四开户,开户金额为1---*/
insert into bank values('张三','10010001',1000)
insert into bank values('李四','10010002',1)
/*---插入测试数据:张三取钱200---*/
insert into transInfo(cardId,transType,transMoney) values('10010001','支取',200)
/*--有默认约束时,表名称后面必须写上除了默认列以外的所有列名,否则出错(像上面不写 transDate 这一列)--*/
---查看结果
select * from bank
select * from transInfo
go
/*---创建 Insert 触发器---*/
if exists(select name from sysobjects where name='trig_transInfo')
drop trigger trig_transInfo
go
/*--创建Insert触发器:在交易信息表transInfo上创建插入触发器--*/
create trigger trig_transInfo
on transInfo
for insert
as
/*---定义变量:用于临时存放插入的卡号、交易类型、交易金额等---*/
declare @type char(4),@outMoney money
declare @myCardID char(10),@balance money
/*--- inserted 临时表中获取插入的记录行信息:包括交易类型、卡号、交易金额---*/
select @type=transType,@outMoney=transMoney,@myCardID=cardID from inserted
/*---根据交易类型是支取/存入,减少或增加帐户表(bank)中对应卡号的余额---*/
if(@type='支取')
  update bank set currentMoney=currentMoney-@outMoney where cardID=@myCardID
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
/*---测试触发器插入测试数据:张三取钱200,李四存钱50000---*/
--delete from transInfo
set nocount on  --不显示T-SQL语句影响的记录行数
insert into transInfo(cardID,transType,transMoney) values('10010002','存入',500000)
insert into transInfo(cardID,transType,transMoney) values('10010001','支取',200)
--查看结果
select * from bank
select * from transInfo
go
/*---创建删除触发器---*/
use stuDB
go
if exists(select name from sysobjects where name='trig_delete_transInfo')
drop trigger trig_delete_transInfo
go
/*---创建 delete 触发器:在交易信息表 transInfo 上创建删除触发器---*/
create trigger trig_delete_transInfo
on transInfo
for delete
as
  print '开始备份数据,请稍后.....'
  if not exists(select * from sysobjects where name='backupTable')
      select * into backupTable from deleted -- deleted 表中获取被删除的数据
  else
      insert into backupTable select * from deleted
  print '备份数据成功,备份表中的数据为:'
  select * from backupTable
go
/*---测试触发器:删除数据---*/
set nocount on --不显示 T-SQL 语句影响的记录行数
delete transInfo
--查看结果
print '交易信息表中的数据:'
select * from transInfo
go
/*---创建 Update 触发器---*/
use stuDB
go
/*---检测是否存在:触发器存放在系统表 sysobjects ---*/
if exists(select name from sysobjects where name='trig_update_bank')
drop trigger trig_update_bank
go
/*---创建 update 触发器:在表 transInfo 上创建更新触发器---*/
create trigger trig_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 --交易金额是否>20000
        begin
          print '交易金额:'
          +convert(varchar(8),abs(@afterMoney-@beforeMoney))
          raiserror('每笔交易不能超过2万元,交易失败',16,1)
          rollback transaction  --回滚事物,撤销交易
        end
go
/*---测试触发器:修改余额---*/
null官方更新地址
set nocount on  --不显示 T-SQL 语句影响的记录行数
update bank set currentMoney=currentMoney+25000 where cardID='10010001'  --凭存折
go
insert into transInfo(cardID,transType,transMoney) values('10010002','支取',30000) --凭卡
go
insert into transInfo(cardID,transType,transMoney) values('10010002','存入',500)  --凭卡
go
--查看结果
print '帐户信息表中的数据:'