数据库 触发器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库 触发器相关的知识,希望对你有一定的参考价值。
为什么需要触发器(TRIGGER)呢?典型的应用就是银行的取款机系统
最优的解决方案就是采用触发器:
它是一种特殊的存储过程
也具备事务的功能
它能在多表之间执行特殊的业务规则
触发器是在对表进行插入、更新或删除
操作时自动执行的存储过程
- 触发器通常用于强制业务规则
- 触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束
- 可执行复杂的SQL语句(if/while/case) 可引用其它表中的列
- 触发器定义在特定的表上,与表相关 不能直接调用的存储过程
- 是一个事务(可回滚)
触发器分为两大类:
DML触发器:
DDL触发器当服务器或者数据库中发生数据操纵语言(DML)事件时将被调用,
主要包括四种类型:
DELETE 触发器
INSERT 触发器
UPDATE 触发器
INSTEAD OF 触发器
DDL触发器:
DDL触发器当服务器或者数据库中发生数据定义语言(DDL)事件时将被调用
创建DML触发器语法:
CREATE TRIGGER [schema_name.]trigger_name ON {table | view} [WITH ENCRYPTION] {FOR | AFTER | INSTEAD OF} {[INSERT] [,] [UPDATE] [,] [DELETE]} AS {sql_statement [;] }
WITH ENCRYPTION表示加密触发器定义的SQL文本 DELETE, INSERT, UPDATE指定触发器的类型 INSTEAD OF一般用于视图
触发器触发时: 系统自动在内存中创建deleted表或inserted表 只读,不允许修改;触发器执行完成后,自动删除
问题: 解决上述的银行取款问题:当向交易信息表(transInfo)中插入一条交易信息时,我们应自动更新对应帐户的余额。
分析: 在交易信息表上创建INSERT触发器 从inserted临时表中获取插入的数据行 根据交易类型(transType)字段的值是存入/支取, 增加/减少对应帐户的余额。
-------关键代码------ 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 ….. GO
小结
触发器是在对表进行插入、更新或删除操作时自动执行的存储过程,
触发器通常用于强制业务规则
触发器还是一个特殊的事务单元,当出现错误时,可以执行ROLLBACK TRANSACTION回滚撤销操作
触发器一般都需要使用临时表:deleted表和inserted表,它们存放了被删除或插入的记录行副本
触发器类型: DML触发器 DDL触发器
以上是关于数据库 触发器的主要内容,如果未能解决你的问题,请参考以下文章