Sqlserver 触发器的使用

时间:2021-10-03 03:12:26

   说到触发器,个人感觉也不是多太常用,那什么时候要用到触发器呢?触发器又有哪些有优点呢?

   个人理解触发器的优点无非有3种(个人理解,仅供参考):

   1,自动性:也就是说我在A表上建了一个触发器,如果我在A表中插入,修改,或者删除一条数据,那么触发器就会自动触发了。

   2,层叠修改:比如我在A表插入一条数据,那么我可以操作与A表相关联的其他表,可以删除或更新包含外键关系中所涉及的数据的所有行。

   3,强制限制:也就是可以做判断,if  什么  else 什么。

 触发器到底有几种呢?我记得刚开始学如何使用触发器的时候,百度上写了一大堆,其实归结起来也就三种:

     UPDATE:更新

     DELETE:删除

     INSERT:插入

  上面介绍了触发器的基本用途和信息,具体如何运用,我就举一个简单的小例子吧! 

     我们就以仓库的出库和入库具体吧!首先我们要建两个表一个是仓库出入库记录表(记录每一笔出货,入货记录):StockDetail,一个是库存总表(记录仓库目前各种货物的总数):StockSum

      Sqlserver 触发器的使用

     StockDetail 表中:StockDetailID:主键   StockCount:出入货物数量   InOrOut:出入库标志 0代表出库,1代表入库 GoodsType: 商品种类。

      StockSum 表中:StockSumID:主键    Sum:每种商品的中数量   GoodsType:商品种类。

下面我们就模拟一个入库操作,就以StockDetail 表中第三条数据为例。(第三条数据表示想仓库中的商品种类2入库40)

     首先我们要建一个触发器,如何建看下图:

 Sqlserver 触发器的使用

     右击,选择新建触发器就可以了。

下面是触发器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
  )

没有执行入库操作前两个表的情况:

Sqlserver 触发器的使用Sqlserver 触发器的使用

 

执行操作后两个表的情况:

 

 Sqlserver 触发器的使用Sqlserver 触发器的使用

对比一下是不是变了,入库记录多一条的同时,库存商品类型2加个30个商品。

   个人感觉,用触发器其实真没多大必要,像这种逻辑操作,我一个存储过程就搞定了,感觉真实没必要用触发器。再说用触发器,在后期维护的时候很容易被遗忘,尤其是前一个人交接给后一个人的工作,用触发器操作数据库,很难找。我深有体会,真他妈太苦逼了!