触发器_差之毫厘谬以千里
最近在學習數據庫的相關知識(啊,啊,啊,我不想說我是為了準備考試,否則好丟人啊。。。) 
 課本名:《全國計算機等級考試三級教程–數據庫技術 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的內容。。。。
總結
以上是生活随笔為你收集整理的触发器_差之毫厘谬以千里的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 二级分销小程序怎么做
- 下一篇: JavaScript学习之ES6 ES2
