SQLSERVER觸發器觸發INSERT,UPDATE,DELETE三種狀態


SQLSERVER觸發器觸發INSERT,UPDATE,DELETE三種狀態

一個觸發器內三種INSERT,UPDATE,DELETE狀態

CREATE   TRIGGER   tr_T_A   ON     T_A   for   INSERT,UPDATE,DELETE         

  如IF   exists   (select   *   from   inserted)   and   not   exists   (select   *   from   deleted)   則為   INSERT   

  如IF   exists(select   *   from   inserted   )   and   exists   (select   *   from   deleted)   則為   UPDATE   

  如IF   exists   (select   *   from   deleted)   and   not   exists   (select   *   from   inserted)則為   DELETE  

 

插入操作(Insert):Inserted表有數據,Deleted表無數據 

刪除操作(Delete):Inserted表無數據,Deleted表有數據 

更新操作(Update):Inserted表有數據(新數據),Deleted表有數據(舊數據)

 

---------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------

SQL中觸發器的使用

原文地址:https://www.cnblogs.com/feiquan/archive/2018/04/01/8685722.html
 

創建觸發器 是特殊的存儲過程,自動執行,一般不要有返回值

 

類型:

  1.后觸發器 (AFTER,FOR)先執行對應語句,后執行觸發器中的語句

  2.前觸發器  並沒有真正的執行觸發語句(insert,update,delete),而是執行觸發后的語句

  3.行級觸發器 (FOR EACH ROW) 在SQL server 中不存在

 

商品號為1的庫存量:

 

1.后觸發器(實現不同表之間的約束)

 

復制代碼
--實現在銷售量不大於庫存量時,每賣出n件商品,對應商品的庫存要減n,若銷售量大於庫存量,則回滾此次操作
IF EXISTS (SELECT *FROM sysobjects WHERE name='tr_SaleCommodity')
    DROP TRIGGER tr_SaleCommodity
GO
CREATE TRIGGER tr_SaleCommodity
ON OrderInfo FOR INSERT  --FOR/AFTER為后觸發器
AS
    BEGIN
        IF EXISTS (
            SELECT  * FROM inserted I INNER JOIN CommodityInfo C ON I.CommodityId=C.CommodityId
            WHERE I.Amount>C.Amount
        )
            BEGIN
                ROLLBACK  --后觸發器
                PRINT '商品的銷售量大於商品的庫存量'
            END    
        ELSE
            BEGIN
                UPDATE CommodityInfo
                SET Amount=Amount-(SELECT Amount FROM inserted)
                WHERE CommodityId IN
                (
                    SELECT CommodityId FROM inserted
                )
            END
    END
GO
復制代碼

執行:

INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)
VALUES('YOUYOU',1,10,600,'網上銀行','2014-11-11 00:00:00.000',1,1)

結果:

  注意:1.上一行為銷售記錄,下一行為商品1的信息

     2.賣出10個,庫存量由48變為38 

       3.可以看出以上的銷售記錄中的Paymoney是不正確的,它的值應該是Amount*OutPrice=10*300,所以需要前觸發器來約束

 

2.前觸發器(可以實現行級觸發器功能)

 

復制代碼
--實現了日期校驗和支付金額的計算
IF EXISTS(SELECT* FROM sysobjects WHERE name='tr_DateConfim')
    DROP TRIGGER tr_DateConfim
GO
CREATE TRIGGER tr_DateConfim
ON OrderInfo INSTEAD OF INSERT ,UPDATE
AS
    BEGIN
        DECLARE @date datetime
        SELECT @date=OrderTime FROM inserted
        IF @date BETWEEN '2012-1-1' AND '2015-1-1'
            BEGIN
                DECLARE @UserId varchar(20) ,@CommodityId int,@Amount int,@PayMoney money,@PayWay varchar(20),@OrderTime datetime,@Confirm int,@SendGoods int
                SELECT @UserId=UserId,@CommodityId=CommodityId,@Amount=Amount,@PayWay=PayWay,@OrderTime=OrderTime,@Confirm=Confirm,@SendGoods=SendGoods FROM inserted
                DECLARE @outPrice money
                SELECT @outPrice=OutPrice FROM CommodityInfo WHERE CommodityId=@CommodityId
                SET @PayMoney=@outPrice*@Amount
                PRINT 'inserted 中的數據:'+CONVERT(varchar(20),@UserId)+' '+CONVERT(varchar(20),@CommodityId)+' '+CONVERT(varchar(20),@Amount)+' '+CONVERT(varchar(20),@PayMoney)+' '+CONVERT(varchar(20),@PayWay)+' '+CONVERT(varchar(20),@OrderTime)+' '+CONVERT(varchar(20),@Confirm)+' '+CONVERT(varchar(20),@SendGoods)+' '+CONVERT(varchar(20),@outPrice)
                INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)
                SELECT UserId,CommodityId,Amount,@PayMoney,PayWay,OrderTime,Confirm,SendGoods FROM inserted
            END
        ELSE 
            PRINT '你插入的數據中的時間只能在 2012-1-1 到 2015-1-1 中間'
    END
GO
復制代碼

執行:

INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayWay,OrderTime,Confirm,SendGoods)
VALUES('YOUYOU',1,5,'網上銀行','2013-1-11',1,1)

   注意:這里插入時我並沒有定義PayMoney,PayMoney是通過觸發器來自動計算的

結果:

日期不正確:

 

日期正確:

打印信息對應:@UserId+' '+@CommodityId+' '+@Amount+' '+@PayMoney+' '+@PayWay+' '@OrderTime+' '@Confirm+' '+@SendGoods+' '@outPrice

 

3.行級觸發器(錯誤)

  

執行結果:

可以看出在SQL server中並不支持行級觸發器

如果是此文是轉載文章,本人會附上轉載鏈接,此篇文章的版權歸原創作者所屬,如果侵權請與我聯系,我會刪除此文。

若沒有標明轉載鏈接,此篇文章屬於本人的原創文章,其版權所屬:
作者:feiquan
出處:http://www.cnblogs.com/feiquan/
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
大家寫文都不容易,請尊重勞動成果~ 這里謝謝大家啦(*/ω\*)
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM