最近线上有个问题是要给拥有A权限的所有角色添加A权限下的一个子权限A1,因为需要查询A权限的所有角色,并批量
添加子权限A1,所以简单的sql不能处理此问题,有两种方法:1. 写脚本解决 2. 用存储过程解决。
脚本相对简单些,在此不做记录,主要讲一下存储过程解决办法。
#### 拥有**权限的角色添加 **报表权限
DELIMITER //
DROP PROCEDURE IF EXISTS batch_add_access_for_yingyun //
CREATE PROCEDURE batch_add_access_for_yingyun()
BEGIN
DECLARE role_id INT; #定义变量 角色id
DECLARE str VARCHAR (300); #为了给个该存储函数执行成功后给个提示
DECLARE s INT DEFAULT 0; #这个用于处理游标到达最后一行的情况
DECLARE yingyun_module_id INT DEFAULT (SELECT `module_id` FROM `module_info` WHERE `module_name` = '营运');
DECLARE **_module_id INT DEFAULT (SELECT `module_id` FROM `module_info` WHERE `module_name` = '**报表');
#声明游标cursor_name(cursor_name是个多行结果集)
DECLARE role_ids CURSOR FOR SELECT `role_id` FROM `role_relation_map` WHERE `module_id` = yingyun_module_id;
#设置一个终止标记
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = 1;
SET str = '--';
#打开游标
OPEN role_ids;
#获取游标当前指针的记录,读取一行数据并传给变量role_id
FETCH role_ids INTO role_id;
SELECT role_id;
WHILE s <> 1 DO
SET str = CONCAT(str, s);
INSERT INTO `role_relation_map` (`role_id`,`module_id`)
SELECT role_id, **_module_id FROM DUAL WHERE NOT EXISTS
(SELECT `role_relation_id` FROM `role_relation_map`
WHERE `role_id` = role_id AND `module_id` = **_module_id);
#读取下一行数据
FETCH role_ids INTO role_id;
END WHILE;
#关闭游标
CLOSE role_ids;
SELECT str;
END//
DELIMITER ;
CALL batch_add_access_for_yingyun();
以上就是整个存储过程的描述。
有以下几个知识点需要总结吧:
1.存储过程结果体中的变量定义
①DECLARE用来声明局部变量,且DECLARE仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前;可以被用在嵌套的块中,除了那些用相同名字声明变量的块。
②如果要给变量提供一个默认值,使用DEFAULT子句(值可以是常数,也可以指定为一个表达式);如果没有DEFAULT子句,初始值为NULL。
参考链接:https://www.cnblogs.com/geaozhang/p/6803423.html
https://www.cnblogs.com/vincentvoid/p/6433085.html
2.游标的定义和循环遍历调用
参考链接:https://www.cnblogs.com/phao123/p/5941293.html
3.mysql插入前判断数据是否存在
参考链接:https://blog.csdn.net/lai0yuan/article/details/78234102
https://www.cnblogs.com/xingmeng/p/4446613.html
4.存储过程的整体使用
参考链接:https://blog.csdn.net/Tom_Green/article/details/78229904
如果好的意见或建议,请不吝赐教~