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

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

2019-10-15 · 学而不思则罔,思而不学则殆
爱教育爱学习
采纳数:384 获赞数:112732

向TA提问 私信TA
展开全部

mysql用触发器禁止某条记录的删除、修改:

delimiter //

CREATE TRIGGER xx_company_agent_update  BEFORE UPDATE ON xx_company_agent

 FOR EACH ROW

BEGIN

IF OLD.bank_card is not null THEN

SET NEW.bank_card = OLD.bank_card,NEW.money= OLD.money,NEW.real_money=OLD.real_money,NEW.bank_name=OLD.bank_name;

END IF;

END;//

delimiter ;

扩展资料

mysql触发器的使用

用户记录用户的预期事件(schema是特殊用户的数据库对象集合。这些对象包括:表,索引,视图,存储程序等。在Oracle里, schema要求创建一个用户。但是也可以创建一个没有schema的用户(根本没有对象)。

所以在Oracle-中,用户就是一个帐户而schema就是对象。可能在其他的数据库平台上可以创建一个没有用户的schema。LOGOFF不能是AFTER LOGOFF,将会重新操作,这里应该是BEFORE,否则就会报错:替换可以插入不能有AFTER。创建或替换触发器MYLOGOFFTRIGGER。

参考资料来源:百度百科—mySQL

匿名用户
推荐于2017-11-25
展开全部
由于 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)
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友4b68195
2013-01-06 · TA获得超过1520个赞
知道大有可为答主
回答量:1773
采纳率:100%
帮助的人:1720万
展开全部
我做了一个测试,这样在删除记录时报错,而不能删除,你看可不可以
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 $
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式