說到觸發器,個人感覺也不是多太常用,那什么時候要用到觸發器呢?觸發器又有哪些有優點呢?
個人理解觸發器的優點無非有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個商品。
個人感覺,用觸發器其實真沒多大必要,像這種邏輯操作,我一個存儲過程就搞定了,感覺真實沒必要用觸發器。再說用觸發器,在后期維護的時候很容易被遺忘,尤其是前一個人交接給后一個人的工作,用觸發器操作數據庫,很難找。我深有體會,真他媽太苦逼了!