mysql 触发器循环执行操作

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; /循环结束/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值