触发器

--1.什么是触发器
--触发器是在对表进行插入、更新或删除操作时自动执行的存储过程
--触发器通常用于强制业务规则
--触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 
--触发器定义在特定的表上,与表相关
--自动触发执行
--不能直接调用
--是一个事务(可回滚)
--2.触发器的类型
--DELETE 触发器   INSERT 触发器  UPDATE 触发器

--3.创建触发器
--CREATE TRIGGER trigger_name
-- ON table_name
-- FOR [DELETE, INSERT, UPDATE]
-- AS 
--  T-SQL语句
--GO

create table transinfo
(
   cardId varchar(7),
   transType varchar(4),
   transMoney decimal(18,2)
)

--3.1解决上述的银行取款问题:当向交易信息表(transInfo)中插入一条交易信息时
--我们应自动更新对应帐户的余额。 
create trigger trig_transInfo
on transinfo
for insert--insert触发器,系统自动生成inserted表
as
--inserted表中临时保存了被插入或被更新后的记录行
declare @cardid varchar(7)
declare @transType varchar(4)
declare @transMoney decimal(18,2)
--select * from inserted:理解inserted表
select @cardid=cardId,@transType=transType,
@transMoney=transMoney from inserted
if @transType='支取'
    update bank set currentMoney=currentMoney-@transMoney
     where cardid=@cardid
else
    update bank set currentMoney=currentMoney+@transMoney
     where cardid=@cardid
go

--当向transinfo表中插入数据时,触发trig_transinfo触发器
insert transinfo values('1001101','存款',200)

--3.2当删除交易信息表时,要求自动备份被删除的数据到表backupTable中 
create trigger trig_delete_transinfo
on transinfo
for delete --delete触发器只会生deleted表
as
if exists(select * from sysobjects where name='backupTable')
  begin
    print '备份到已存在的backupTable表中'
    insert into backupTable select * from deleted
  end
else
  begin
    print '备份到不存在的backupTable表中'
    select * into backupTable from deleted 
  end
go

--当删除transinfo表中的数据时,触发trig_delete_transinfo触发器
delete from transinfo

--3.3跟踪用户的交易,交易金额超过20000元,
--则取消交易,并给出错误提示。                   
alter trigger trig_update_bank
on bank
for update--update触发器,系统自动成inserted,deleted表
as
declare @bMoney decimal(18,2)
declare @aMoney decimal(18,2)
select @bMoney=currentMoney from deleted
select @aMoney=currentMOney from inserted
if abs(@aMoney-@bMoney)>20000
   begin
     print '交易额不能超过20000'
     rollback tran
   end
else
   begin
     print '交易成功'
   end
go

--当向transinfo表中插入数据时,触发trig_transinfo触发器
--trig_transinfo触发器中修改bank表数据,再次触发trig_update_bank触发器
insert transinfo values('1001101','存款',1000)



--触发器触发时:
--系统自动在内存中创建deleted表或inserted表
--只读,不允许修改;触发器执行完成后,自动删除
--inserted 表 
--用于存储 INSERT 和 UPDATE 语句所影响的行的副本,即在inserted 表中临时保存了被插入或被更新后的记录行。在执行INSERT 或 UPDATE 语句时,新加行被同时添加到 inserted 表和触发器表中。由此我们可以从inserted检查插入的数据是否满足业务需求。如果不满足,就可以向用户报告错误消息,并回滚撤销操作。 
--deleted 表
--用于存储 DELETE 和 UPDATE 语句所影响的行的副本,即在deleted表中临时保存了被删除或被更新前的记录行。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。由此我们可以从deleted 表中检查删除的数据行是否能删除。如果不能,就可以回滚撤销此操作,因为触发器本身就是一个特殊的事务单元。

 

posted @ 2014-03-31 13:53  放手风筝  阅读(303)  评论(0编辑  收藏  举报