mysql 触发器阻止删除_mysql如何用触发器禁止某条记录的删除、修改

用户提问

该表中有俩非常重要的记录,这俩记录不可以被删除和修改。不要说设置权限什么的,不符合上级要求。阻止修改很简单,触发器中令new.xxx=XXX就可以了。可是删除怎么搞?不要说删除之后立刻添加,因为该表已有insert的触发器,这个时候出发该触发器会有问题的。刚刚看到说用回滚,我觉得这个方法好,可我回滚了半天也没用。能否贴出代码?小弟不胜感激。

推荐答案

由于 MySQL 没有直接抛出异常的语句

因此这里通过在触发器里面,插入/删除自己这个表

导致 MySQL 发生异常

发生异常了, 就会自动回滚掉 删除数据的处理了.

一个例子

货物表

CREATE TABLE Goods(

id INT,

Amount INT

);

订单表

CREATE TABLE OrderDetail(

ID INT,

GoodsID INT,

Amount INT

);

库存测试数据:

INSERT INTO Goods VALUES (1, 100);

要求:当订单表插入数据的时候,自动去货物表检查,是否有足够的库存

如果有,那么更新货物表的库存 = 原库存– 本次订单数量

如果库存不足,抱错返回.

DELIMITER //

CREATE TRIGGER BeforeInsertOrderDetail

BEFORE INSERT ON OrderDetail

FOR EACH ROW

BEGIN

DECLARE

v_nowCount INT;

SELECT

Amount INTO v_nowCount

FROM

Goods

WHERE

ID = new.GoodsID;

IF v_nowCount - new.Amount < 0 THEN

-- 由于 MySQL 没有直接抛出异常的语句

-- 因此这里通过在触发器里面,插入/删除自己这个表

-- 导致 MySQL 发生异常

DELETE FROM

OrderDetail

WHERE

ID = new.GoodsID;

ELSE

UPDATE

Goods

SET

Amount = Amount - new.Amount

WHERE

ID = new.GoodsID;

END IF;

END;

//

DELIMITER ;

处理前

mysql> select * from goods;

+------+--------+

| id | Amount |

+------+--------+

| 1 | 100 |

+------+--------+

1 row in set (0.00 sec)

mysql> select * from OrderDetail;

Empty set (0.00 sec)

mysql> INSERT INTO OrderDetail VALUES(1, 1, 90);

Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO OrderDetail VALUES(1, 1, 20);

ERROR 1442 (HY000): Can't update table 'orderdetail' in stored function/trigger

because it is already used by statement which invoked this stored function/trigg

er.

处理后

mysql> select * from goods;

+------+--------+

| id | Amount |

+------+--------+

| 1 | 10 |

+------+--------+

1 row in set (0.00 sec)

mysql> select * from OrderDetail;

+------+---------+--------+

| ID | GoodsID | Amount |

+------+---------+--------+

| 1 | 1 | 90 |

+------+---------+--------+

1 row in set (0.00 sec)

辅助答案

用户:syz888

2018年01月13日

我做了一个测试,这样在删除记录时报错,而不能删除,你看可不可以

delimiter $

create procedure rb()

begin

rollback;

end $

create trigger trigger1 before delete on table

for each now

begin

if old.xxx=XXX then

call rb ;

end if ;

end $

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值