数据库 触发器

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触发器

 

以上是关于数据库 触发器的主要内容,如果未能解决你的问题,请参考以下文章

导航到另一个片段时触发 API 调用

我如何使用 codeanywhere 片段

前端防扒代码片段

前端防扒代码片段

前端防扒代码片段

前端防扒代码片段