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