触发器
--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 表中检查删除的数据行是否能删除。如果不能,就可以回滚撤销此操作,因为触发器本身就是一个特殊的事务单元。