mysql 触发器循环执行操作
一、应用场景
添加菜单的时候默认给已设置菜单权限的用户新增此权限,本功能应该是一起写好的。但由于我比较懒,加上这个权限不是那么重要,因此就没写 添加菜单的功能,添加菜单都是在数据库中直接操作。由而引发了这个问题:使用触发器添加菜单循环向菜单权限表增加该菜单权限。大家平时不要这样使用菜单权限哈,这里是偷个懒引发这个问题。
二、上代码
这里我用的是游标的循环,其他几种可以看看网上教程
CREATE TRIGGER `menu增加` AFTER INSERT ON `tab_menu` FOR EACH ROW BEGIN
/*定义属性*/
declare done int default 0;/*判断循环是否关闭的标志位*/
declare this_pid int(11);
declare this_auth_ids varchar(255);
/*定义游标 以及赋值 如果多个值就注意下游标取值 ***/
declare result cursor for select p_id,menu_ids from tab_menu_auth where menu_ids != '';
/*定义异常处理 */
declare continue handler for not found set done = 1;
/*打开游标*/
open result ;
/*循环开始*/
flag_loop:loop
/*如果 done==1 有异常 结束循环*/
if done = 1 then leave flag_loop; end if;
/*提取游标的值 多个值的时候: fetch xxx into xxx,xxx 按照定义游标result里值的顺序赋值*/
fetch result into this_pid,this_auth_ids;
/*根据游标中的数据更新menu_auth表*/
update tab_menu_auth set menu_ids = concat(this_auth_ids,',',new.id) where p_id = this_pid;
end loop; /*循环结束*/
close result ;/*关闭游标*/
end;
三、简单说下
首先定义触发器insert事件after。
1.先定义变量 declare done int default 0;/判断循环是否关闭的标志位/
declare this_pid int(11);declare this_auth_ids varchar(255);第一个是用来判断是否有异常,第2,3变量是用来存储要循环的值的变量。
2. declare result cursor for select p_id,menu_ids from tab_menu_auth where menu_ids != ‘’; /查出所有设置过权限的用户id和权限ids 并赋值给reuslt/
3. flag_loop:loop /循环开始/
4. fetch result into this_pid,this_auth_ids; /提取result的值分别赋值给之前定义好的标量this_pid和this_auth_ids/
5. /根据游标中的数据更新menu_auth表/
update tab_menu_auth set menu_ids = concat(this_auth_ids,’,’,new.id) where p_id = this_pid;
/*concat(this_auth_ids,’,’,new.id)是把当前查出的ids拼接上‘,’然后再拼接上new.id。*new.id是触发器中的系统变量吧,表示新增记录的id/
6. end loop; /循环结束/