- #創(chuàng)建觸發(fā)器,當(dāng)往order表中添加記錄是,更新goods表
- delimiter $
- CREATE TRIGGER trigger1
- AFTER INSERT ON `order`
- FOR EACH ROW
- BEGIN
- UPDATE goods SET num=num-new.much WHERE id=new.gid;
- END$
- 執(zhí)行
- INSERT INTO `order` (gid,much) VALUES(1,5)
- 后
- SELECT * FROM goods WHERE id=1
- 發(fā)現(xiàn) 電視機(jī)的數(shù)量剩下30
- 當(dāng)執(zhí)行
- INSERT INTO `order` (gid,much) VALUES(2,100)
- 后
- 發(fā)現(xiàn)
- 冰箱的數(shù)量剩下-77
- 這是一個(gè)很明顯的漏洞,如何補(bǔ)救呢?
- 由于update事件是在insert之后發(fā)生的,所以我們無(wú)法事先對(duì)用戶的下單數(shù)量(即order表
- 中的much字段)進(jìn)行過濾
- 解決辦法:
- 在創(chuàng)建觸發(fā)器的時(shí)候,將after關(guān)鍵字改成before,并對(duì)用戶的下單數(shù)量進(jìn)行判斷
- 首先,得刪除先去的觸發(fā)器
- drop trigger trigger1;
- #創(chuàng)建觸發(fā)器
- #觸發(fā)時(shí)間:before
- delimiter $
- CREATE TRIGGER trigger1
- BEFORE INSERT ON `order`
- FOR EACH ROW
- BEGIN
- IF new.much >5 THEN
- SET new.much=5
- END IF;
- UPDATE goods SET num=num-new.much WHERE id=new.gid;
- END$
- 這樣,當(dāng)執(zhí)行INSERT INTO `order` (gid,much) VALUES(2,100)的時(shí)候,寫入order表的下單數(shù)量其實(shí)只有5,同樣,goods表中的庫(kù)存數(shù)量只有減少5,因?yàn)樵?/span>insert操作之前先觸發(fā)了
- update操作,借此可以對(duì)下單數(shù)量做個(gè)判斷
新聞熱點(diǎn)
疑難解答
圖片精選