操作方法
触发器作用: a.触发器通常用于强制业务规则 b.触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 c.可执行复杂的SQL语句(if/while/case) 可引用其它表中的列 d.触发器定义在特定的表上,与表相关 不能直接调用的存储过程 e.是一个事务(可回滚) ps:它是一种特殊的存储过程,也具备事务的功能,它能在多表之间执行特殊的业务规则. 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。
--创建触发器语法 create trigger trigger_name on {table_name|view_name} {After|Instead of} {insert|update|delete} as 相应T-SQL语句
--触发器 我们用银行转账作为例子 --创建一张银行表 create table bank ( cardId char(9) primary key, customerName CHAR(10), --顾客姓名 currentMoney MONEY default(1) check(currentMoney>0) --当前余额 ) go create table transInfo ( cardId char(9) references bank(cardId) , transType varchar(10) not null, transMoney MONEY not null ) go INSERT INTO bank(cardId,customerName,currentMoney) VALUES('1001 0001','张三',1000) INSERT INTO bank(cardId,customerName,currentMoney) VALUES('1001 0002','李四',1) go
create trigger trig_Trans on transInfo for insert as declare @money money declare @cardId char(9) select @cardId=cardId,@money=case transType when '支出' then -transMoney else transMoney end from inserted update bank set currentMoney=currentMoney+@money where cardId=@cardId if(@@error>0) begin raiserror('交易失败',5,1) rollback end else begin print('交易成功') --commit end go
执行触发器 ,在添加数据这个操作的时候 insert into transInfo values('1001 0001','支取',200)insert into transInfo values('1001 0002','存入',20000)insert into transInfo values('1001 0002','支取',20001)
create trigger trig_Bank on bank for update as declare @newMoney money declare @oldMoney money declare @money money declare @cardId char(9) select @cardId=cardId,@newMoney=currentMoney from inserted select @oldMoney=currentMoney from deleted set @money= abs(@newMoney-@oldMoney) if(@money>20000) begin raiserror('每笔交易金额不能超过20000元,交易失败',6,1) print('交易金额:'+convert(varchar(20),@money)) rollback end else begin print('交易成功!交易金额:'+convert(varchar(20),@money)) print('帐号:'+convert(varchar(20),@cardId)+'帐户余额:'+convert(varchar(20),@newMoney)) end go
触发器--删除触发: delete bank where cardId='1001 0003'
触发器触发时: 系统自动在内存中创建deleted表或inserted表 只读,不允许修改;触发器执行完成后,自动删除