博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle权限管理应用,判断A字段中是否包含B字段的值
阅读量:6271 次
发布时间:2019-06-22

本文共 925 字,大约阅读时间需要 3 分钟。

应用场景:

做项目时遇到一个需求,在向数据库中插入数据时,根据插入者角色的不同(项目中把登陆系统的人分成多个角色),不同角色的用户插入的数据只有固定角色的用户可以查看,例如:角色为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的人就查询不到这条数据。

简单,粗暴

 

转载于:https://www.cnblogs.com/fengzhilingwu/p/5713618.html

你可能感兴趣的文章
Android下创建一个sqlite数据库
查看>>
数组<=>xml 相互转换
查看>>
MFC单文档应用程序显示图像
查看>>
DT科技评论:第2期
查看>>
poj 2777(线段树的节点更新策略)
查看>>
Swift-EasingAnimation
查看>>
[翻译] BKZoomView
查看>>
C++类设计的一些心得
查看>>
tableVIew删除时的delete按钮被挡住时重写的方法
查看>>
读cookie中文字符乱码问题
查看>>
招募译者翻译并发数据结构
查看>>
普通表转换为分区表
查看>>
Java 容器 & 泛型:三、HashSet,TreeSet 和 LinkedHashSet比较
查看>>
性能优化总结(六):预加载、聚合SQL应用实例
查看>>
Drill官网文档翻译四 Drill的性能
查看>>
一步一步教你用PHP+MySql搭建网站 No.1 主页&amp;数据库连接
查看>>
JAVA网络编程之Socket
查看>>
翻翻git之---偏向iOS风格的Switch ToggleSwitch
查看>>
Python 全栈开发 -- 开发环境篇
查看>>
python dict type like json
查看>>