说到触发器,个人感觉也不是多太常用,那什么时候要用到触发器呢?触发器又有哪些有优点呢?
个人理解触发器的优点无非有3种(个人理解,仅供参考):
1,自动性:也就是说我在A表上建了一个触发器,如果我在A表中插入,修改,或者删除一条数据,那么触发器就会自动触发了。
2,层叠修改:比如我在A表插入一条数据,那么我可以操作与A表相关联的其他表,可以删除或更新包含外键关系中所涉及的数据的所有行。
3,强制限制:也就是可以做判断,if 什么 else 什么。
触发器到底有几种呢?我记得刚开始学如何使用触发器的时候,百度上写了一大堆,其实归结起来也就三种:
UPDATE:更新
DELETE:删除
INSERT:插入
上面介绍了触发器的基本用途和信息,具体如何运用,我就举一个简单的小例子吧!
我们就以仓库的出库和入库具体吧!首先我们要建两个表一个是仓库出入库记录表(记录每一笔出货,入货记录):StockDetail,一个是库存总表(记录仓库目前各种货物的总数):StockSum
StockDetail 表中:StockDetailID:主键 StockCount:出入货物数量 InOrOut:出入库标志 0代表出库,1代表入库 GoodsType: 商品种类。
StockSum 表中:StockSumID:主键 Sum:每种商品的中数量 GoodsType:商品种类。
下面我们就模拟一个入库操作,就以StockDetail 表中第三条数据为例。(第三条数据表示想仓库中的商品种类2入库40)
首先我们要建一个触发器,如何建看下图:
右击,选择新建触发器就可以了。
下面是触发器sql代码:
USE [MyData] GO /****** Script Date: 2020/1/5 星期日 16:44:01 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO create TRIGGER [dbo].[Tr_StockDetail] ON [dbo].[StockDetail] AFTER INSERT AS DECLARE @StockCount INT, @InOrOut INT, @GoodsType intBEGIN SET NOCOUNT ON; SELECT @StockCount=StockCount,@InOrOut=InOrOut,@GoodsType=GoodsType FROM INSERTED if @InOrOut=1 update StockSum set Sum=SUM @StockCount where GoodsType=@GoodsType else update StockSum set Sum=SUM-@StockCount where GoodsType=@GoodsType END
那接下我们按要求执行一次入库操作:
insert into [MyData].[dbo].[StockDetail] ( [StockCount] ,[InOrOut] ,[GoodsType] )values ( 40, 1, 2 )
没有执行入库操作前两个表的情况:
执行操作后两个表的情况:
对比一下是不是变了,入库记录多一条的同时,库存商品类型2加个30个商品。
个人感觉,用触发器其实真没多大必要,像这种逻辑操作,我一个存储过程就搞定了,感觉真实没必要用触发器。再说用触发器,在后期维护的时候很容易被遗忘,尤其是前一个人交接给后一个人的工作,用触发器操作数据库,很难找。我深有体会,真他妈太苦逼了!