- 1、本文档共28页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
银行的取款机系统
帐户信息表bank
交易信息表transInfo
张三取钱200
问题:
没有自动修改张三的余额
最优的解决方案就是采用触发器:
它是一种特殊的存储过程
也具备事务的功能
它能在多表之间执行特殊的业务规则
张三开户1000元,李四开户1元
什么是触发器 -1
赵六
插入
删除
触发器触发
赵六退休
赵六
员工表
退休员工表
什么是触发器 -2
触发器是在对表进行插入、更新或删除操作时自动执行的存储过程,不能直接调用
触发器通常用于强制业务规则,优越于检查约束
触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束
可执行复杂的SQL语句(if/while/case)
可引用其它表中的列
什么是触发器 -3
触发器定义在特定的表上,与表相关
自动触发执行
不能直接调用
是一个事务(可回滚)
触发器的类型
DELETE 触发器
INSERT 触发器
UPDATE 触发器
inserted 和deleted 表-1
触发器触发时:
系统自动在内存中创建deleted表或inserted表
只读,不允许修改;触发器执行完成后,自动删除
inserted 表
临时保存了插入或更新后的记录行
可以从inserted表中检查插入的数据是否满足业务需求
如果不满足,则向用户报告错误消息,并回滚插入操作
deleted 表
临时保存了删除或更新前的记录行
可以从deleted表中检查被删除的数据是否满足业务需求
如果不满足,则向用户报告错误消息,并回滚插入操作
inserted 和deleted 表-2
修改操作
inserted表
deleted表
增加(INSERT)记录
存放新增的记录
------
删除(DELETE)记录
-----
存放被删除的记录
修改(UPDATE)记录
存放更新后的记录
存放更新前的记录
inserted表和deleted表存放的信息
如何创建触发器
创建触发器的语法:
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE]
AS
T-SQL语句
GO
WITH ENCRYPTION表示加密触发器定义的SQL文本
DELETE, INSERT, UPDATE指定触发器的类型
INSERT触发器
插入记录行
触发insert触发器。向inserted表中插入新行的副本
触发器检查inserted表中插入的新行数据,确定是否需要回滚或执行其他操作
INSERT触发器的工作原理:
INSERT 触发器示例
问题:
解决上述的银行取款问题:当向交易信息表(transInfo)中插入一条交易信息时,我们应自动更新对应帐户的余额。
分析:
在交易信息表上创建INSERT触发器
从inserted临时表中获取插入的数据行
根据交易类型(transType)字段的值是存入/支取,
增加/减少对应帐户的余额。
Insert触发器示例-2
create?trigger?trig_transInfo??
????on?transInfo??
????for?insert??
????as??
??????declare?@type?char(4),@outMoney?money??
????declare?@myCardID?char(10),@balance?money????????
????select?@type=transType,@outMoney=transMoney,@myCardID=cardID?from?inserted???
????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??
从inserted表中获取被删除的交易记录
Insert触发器示例-3
/*---测试触发器执行结果----*
文档评论(0)