在前面有篇文章,是在MYSQL下如何禁用触发器,其实就是使触发器内的trigger_stmt 根据条件有选择性的执行。但是对表的操作,还是进行响应。如果想拦截下对表的操作,比如对某个表的INSERT操作,根据ID判断,ID大于100的不允许插入,不通过上层程序处理,直接用触发器,也是可以实现的。步骤如下
1:创建一个测试表,并加上触发器
127.0.0.1~root@localhost~test>create table trigger_test(a int); Query OK, 0 rows affected (0.06 sec)
127.0.0.1~root@localhost~test>delimiter // 127.0.0.1~root@localhost~test>create trigger trigger_no_insert before insert on trigger_test -> for each row -> begin -> if new.a>100 then -> insert into trigger_test values(0); -> else -> set new.a=new.a+100; -> end if; -> end; -> // Query OK, 0 rows affected (0.01 sec)
|
带下划线的部分,就是拦截部分。如果A大于100,那么进行一个本表的插入,由于MYSQL在触发器内不允许对自身的修改,所以会产生一个1442的错误,插入失败。
127.0.0.1~root@localhost~test>insert into trigger_test values(1); Query OK, 1 row affected (0.00 sec)
127.0.0.1~root@localhost~test>select * from trigger_test; +------+ | a | +------+ | 101 | +------+ 1 row in set (0.00 sec)
|
插入100以内的,触发器正常工作。
再插入一条大于100的。
127.0.0.1~root@localhost~test>insert into trigger_test values(200); ERROR 1442 (HY000): Can't update table 'trigger_test' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. * from trigger_test; +------+ | a | +------+ | 101 | +------+ 1 row in set (0.00 sec)
|
引起一个错误,200没有插入到表,成功拦截了下来。
但是这样在上层程序操作的时候,会得到一个ERR提示。不知道是否有办法可以处理掉这个错误提示,不声不响的把数据操作给拦截下来。待考证。。。
阅读(2850) | 评论(0) | 转发(0) |