最近碰到了一个需求,判断当前登录用户是否有权限查看这行数据,数据如表A所示,如果当前用户具有A,D权限,那么他就能查到 列名为(1,2,3,5)这四条数据,因为要分页显示所以用Java去写显得很麻烦,所以用MySql的自定义
函数解决了,代码如下所示:
--------------------------------------------------------------邪恶的分割线----------------------------------------------------------------------------------
| 列名 | 权限 |
| 1 | A,B,C |
| 2 | A,B |
| 3 | A,D |
| 4 | B,C |
| 5 | B,C,D |
设计思想如下:将传入的字符串进行拆分后,与数据库中相应的字段进行比对,一旦找到一个相同的就直接返回查询的序号即可。(该思路参考了网上的一些代码)
DROP FUNCTION IF EXISTS `findRole `;DROP FUNCTION IF EXISTS `findRole`;CREATE FUNCTION `findRole`(targetStr varchar(2000),findStr varchar(2000))RETURNS varchar(1000)BEGINDECLARE strNum int;DECLARE lenIndex int DEFAULT 1;DECLARE cStr VARCHAR(50);DECLARE flag INT; -- 标志位SET strNum=1+(length(targetStr) - length(replace(targetStr,',','')));WHILE lenIndex<=strNum -- 从一开始循环DOset cStr=reverse(substring_index(reverse(substring_index(targetStr,',',lenIndex)),',',1));-- 这一步的含义请参考函数分解自己实一下,就明白了set flag=FIND_IN_SET(cStr,findStr);if (flag>0&&cStr!='') THENRETURN flag;END IF;set lenIndex=lenIndex+1;END WHILE;RETURN 0;END;--并且进行比较
--------------------------------------------------------解释动作---------------------------------------------------------------------------------------------------------------------
-- 函数分解动作
select length('111,3213,333') -- 12
select replace('111,3213,333',',','') ---1113213333
select length(replace('111,3213,333',',','')) -- 10
select 1+(length('111,3213,333')-length(replace('111,3213,333',',',''))) -- 3 表示有三个需要拆分
select reverse(substring_index('111,3213,333',',',3))
select reverse(substring_index(reverse(substring_index('111,3213,333',',',3)),',',1)); -- 翻转的在翻转就可以取得第一个数
select LOCATE('111','555,777,111'); -- 返回子串 substr 在字符串 str 中的第 pos 位置后第一次出现的位置。
使用方法:
select * from A表 where findRole("A,D",A表.权限)>0)
select * from A表 where findRole("A,D",A表.权限)>0)
Oracle的方式:
SELECT
(select wm_concat(name)
from keming where
instr(Course, code
) > 0) FROM renyuan where name ='张三'
解决如下问题
我现在有一个字段是存:1,2,3的,而它对应另一张值集表中。eg;
课程人员表 renyuan
id name Course
1 张三 1,2,3
值集表 keming
code name
1 语文
2 数字
3 英语
………………
course 与code 关联 查询出结果为:
张三 语文,数字,英语
-----------------------------------------------------------------------谢幕的分割线-----------------------------------------------------------------------------------------------
本文介绍了一种利用MySQL自定义函数实现权限校验的方法,通过字符串操作和比较完成对用户权限的有效验证。
2900

被折叠的 条评论
为什么被折叠?



