关系数据库SQL之可编程性触发器

前言

前面关系数据库SQL之可编程性函数(用户自定义函数)一文提到关系型数据库提供了可编程性的函数、存储过程、事务、触发器及游标,前文已介绍了函数、存储过程、事务,本文来介绍一下触发器的使用。(还是以前面的银行系统为例)

图片来自网络

概述

触发器(TRIGGER)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( INSERT,DELETE, UPDATE)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。

触发器分为两种:AFTER触发器和INSTEAD OF触发器。

语法

  • 创建触发器
CREATE TRIGGER <触发器名称> 
   ON  <表名|视图名> 
   [AFTER | INSTEAD OF] <INSERT,DELETE,UPDATE>
AS 
--SQL语句块
  • 修改触发器
ALERT TRIGGER <触发器名称> 
   ON  <表名|视图名> 
   [AFTER | INSTEAD OF] <INSERT,DELETE,UPDATE>
AS 
--SQL语句块
  • 删除触发器
DROP TRIGGER <触发器名称>

说明:

  1. AFTER触发器主要用于在数据表执行INSERT,DELETE, UPDATE操作之后,同时操作其他表。
  2. INSTEAD OF触发器会替代所要执行的SQL语句,也就是说所要执行SQL并不会真正执行,真正执行的是触发器中定义的操作。
  3. AFTER触发器只针对表操作,INSTEAD OF触发器除了操作表还可以作用于视图,扩展视图可以支持的更新操作。
  4. AFTER触发器是在执行SQL之后触发,而INSTEAD OF触发器是在执行SQL之前触发。
  5. 一个表的INSERT,DELETE, UPDATE操作可以有多个AFTER触发器,有至多一个INSTEAD OF触发器

特殊表

触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)

示例

1.AFTER触发器示例
在取钱时,交易信息表里面插入交易信息,同时要更改账户表里面的余额

--创建触发器
CREATE TRIGGER Trigger_getMoney 
   ON  TransInfo 
   AFTER INSERT
AS 
declare @cardId varchar(19)
declare @tranMoney money
select @cardId  = CardID , @tranMoney = TransMoney from instered;
update CardInfo set LeftMoney = LeftMoney - @tranMoney where CardID = @cardId
GO

--执行插入操作
insert into TransInfo values('1324 3626 7532 1935','取款',500,default);

2.INSTEAD OF触发器
指定的账户"422322001550135015"不可以删除

--创建触发器
CREATE TRIGGER Trigger_deleteAccount 
   ON  AccountInfo 
   INSTEAD OF DELETE
AS 
delete from AccountInfo where CardID != '422322001550135015' AND CardID=(select CardID from deleted)
--执行删除操作

本文就介绍到这里。
如有疑问请联系我。

原文来自:简书

posted @ 2016-05-16 23:57 seayxu 阅读(...) 评论(...) 编辑 收藏
AmazingCounters.com
Flag Counter