应用场景:
做项目时遇到一个需求,在向数据库中插入数据时,根据插入者角色的不同(项目中把登陆系统的人分成多个角色),不同角色的用户插入的数据只有固定角色的用户可以查看,例如:角色为1的用户插入的数据只有角色为1和3和4的用户可以查看,角色为2的用户插入的数据只有角色为1和2的用户可以查看。
解决过程:
在表中添加 showscope 字段,用于存放可查看该数据的人员的角色信息,一开始的想法是在插入数据的同时向该字段插入用逗号间隔的数字来存储查看角色的信息,like:'1,2,3'代表只有角色为1或者2或者3的用户可见,但这样的问题就是在检索出数据的时候非常不方便,因为oracle没有类似mysql中查询包含位置的 FIND_IN_SET 的函数,无法直接的通过一条简单的语句查询出传入的用户角色是否在该字段中,网上搜索的结果都是写存储过程,杀鸡焉用牛刀,这么简单的需求何必这么复杂。
解决方法:
使用两个质数的乘积只能被这两个质数,1和该乘积本身整除的特点来判断角色权限
通过把用户角色由原来的:1,2,3,4......改成使用质数:3,5,7,11......
在表中插入showscope的字段改为改信息可见用户的角色的乘积,即:
该数据如果为角色3和角色5的人可以查看的话,那么showscope字段插入的值为15(3*5)
在查询时通过where条件 showscope是否能被角色整除来判断该角色是否可以查看到该条数据。
select * from 表 where mod(showscope,to_number(?))=0
showscope为可查看该数据的用户号的乘积,?为传进来的用户角色值
eg:
showscope为15,即为用户角色为3和5的人可以访问
select * from 表 where mod(showscope,to_number(‘3’))=0
因为15可以被3整除,所以where后的条件是成立的,如果角色为7,那么由于15不能被7整除,所以角色为7的人就查询不到这条数据。
简单,粗暴