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