日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

    歡迎訪問 生活随笔!

    生活随笔

    當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

    编程问答

    触发器_差之毫厘谬以千里

    發布時間:2024/1/18 编程问答 28 豆豆
    生活随笔 收集整理的這篇文章主要介紹了 触发器_差之毫厘谬以千里 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

    最近在學習數據庫的相關知識(啊,啊,啊,我不想說我是為了準備考試,否則好丟人啊。。。)
    課本名:《全國計算機等級考試三級教程–數據庫技術 2013年版》
    高等教育出版社

    剛學習到關于觸發器的知識,
    發現書上有一個致命的錯誤(哈哈,致命是昨天剛學到的詞匯)
    課本164頁,第八章,在介紹觸發器的時候
    舉的第一個例子:創建后觸發型觸發器
    因為少了一個where條件,會將所有商品的庫存量全部進行修改!!

    =====>
    背景:
    table_salebilldetail 表達的是銷售單據明細表
    其主鍵為:salebillid 銷售單據id
    goodsid 商品id
    另外還有一個屬性:quantity 表達商品銷售的數量

    table_goods 商品表
    主鍵:goodsid 商品id
    屬性值: totalstorage 商品的庫存數量
    =====>
    要求:
    當銷售單據明細表中的商品銷售數量大于此商品的庫存數量(商品表中)時,撤銷此次商品的銷售并提示錯誤。如果銷售數量小于庫存數量,則在插入銷售單據明細記錄時,同時修改此商品的庫存數量。
    =====>
    課本的代碼如下:

    create trigger trigger_1 on table_salebilldetail for insert
    as

    if exists(select 1 from inserted a join table_goods b on a.goodsid = b.goodsid where a.quantity > b.totalstorage)
    begin
    rollback;
    print ‘not encough to sale!’
    end

    else
    update table_goods
    set totalstorage = totalstorage - (select quantity from inserted)

    =====>
    啊,啊, 啊
    發現問題沒有?
    如果 quantity < totalstorage 時,進入else語句
    接下來呢?
    接下來是,所有商品的totalstorage 都被 減了 quantity的量啦!!
    這是什么情況?

    這是一件多么可怕的事情!!
    如果書上的這段代碼被用到實際應用系統中,老總估計要瘋了。。。。

    =====>
    正確的語法應該是這樣的:

    create trigger trigger_1 on table_salebilldetail for insert
    as

    if exists(select 1 from inserted a join table_goods b on a.goodsid = b.goodsid where a.quantity > b.totalstorage)
    begin
    rollback;
    print ‘not encough to sale!’
    end

    else
    update table_goods
    set totalstorage = totalstorage - (select quantity from inserted)
    where goodsid = (select goodsid from inserted);

    =====>
    看到區別了沒有?
    其實就多了一句 where 條件啊!
    這樣就只減少了 inserted 進來的商品的 totalstorage的量!!

    =====>
    寫代碼,還是要細心細心再細心啊
    一定要把邏輯理理清楚,多嘗試,多思考
    才能真正把代碼寫好。。

    =====>
    ps:當然,這里還少了對quantity的判斷,因為如果quantity <=0 的話,肯定會進到else中,這樣邏輯上就不對了
    我們可以在進入else時再進行一次判斷:
    else if (quantity <=0)
    begin
    rollback;
    print ‘Error for quantity!’;
    end
    else
    下面再接else的內容。。。。

    總結

    以上是生活随笔為你收集整理的触发器_差之毫厘谬以千里的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。