Chinaunix首页 | 论坛 | 博客
  • 博客访问: 479932
  • 博文数量: 99
  • 博客积分: 3621
  • 博客等级: 中校
  • 技术积分: 1089
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-22 16:29
文章存档

2012年(21)

2011年(28)

2010年(50)

分类: Mysql/postgreSQL

2010-09-13 22:24:41

在前面有篇文章,是在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提示。不知道是否有办法可以处理掉这个错误提示,不声不响的把数据操作给拦截下来。待考证。。。

阅读(2791) | 评论(0) | 转发(0) |
0

上一篇:管子 牧民 国颂

下一篇:MYSQL--递归查询

给主人留下些什么吧!~~