應用場景:
做項目時遇到一個需求,在向數據庫中插入數據時,根據插入者角色的不同(項目中把登陸系統的人分成多個角色),不同角色的用戶插入的數據只有固定角色的用戶可以查看,例如:角色為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的人就查詢不到這條數據。
簡單,粗暴