有一个权限模块表和一个用户权限组表
权限表字段:
Role_id,Module_id,Value(tinyint)
用户权限组表字段:
User_id,Role_id这里一个用户可以指定多个权限组,而每个权限组里面有可能有重复的模块功能
如何能求出每个用户的具体每个模块的Value值呢?
网上说的位运算Or偷懒的做法就是取其max值,于是我写了如下代码:SELECT r.Module_id, max(r.Value), u.User_id FROM ErpRoleModule AS r INNER JOIN ErpUserRole AS u ON r.Role_id = u.Role_id group by Module_id,user_id看似解决了,其实不然。
因为这里的value是一个Module_id多个功能的合计数
例如:
销售单(是一个module_id),其中
查看:1,Edit:2,Add:4,Delete:8,审核:16
那么对销售单操作的全部功能Value就应该是31
而且用户有可能有多个Role_id,而这些Role_id里面就有可能有重复的Module_id,所以应该用位运算解决。
所以取max是不正确的,而且也不是简单的sum。该如何实现这种位Sum呢?
谢谢!
权限表字段:
Role_id,Module_id,Value(tinyint)
用户权限组表字段:
User_id,Role_id这里一个用户可以指定多个权限组,而每个权限组里面有可能有重复的模块功能
如何能求出每个用户的具体每个模块的Value值呢?
网上说的位运算Or偷懒的做法就是取其max值,于是我写了如下代码:SELECT r.Module_id, max(r.Value), u.User_id FROM ErpRoleModule AS r INNER JOIN ErpUserRole AS u ON r.Role_id = u.Role_id group by Module_id,user_id看似解决了,其实不然。
因为这里的value是一个Module_id多个功能的合计数
例如:
销售单(是一个module_id),其中
查看:1,Edit:2,Add:4,Delete:8,审核:16
那么对销售单操作的全部功能Value就应该是31
而且用户有可能有多个Role_id,而这些Role_id里面就有可能有重复的Module_id,所以应该用位运算解决。
所以取max是不正确的,而且也不是简单的sum。该如何实现这种位Sum呢?
谢谢!
1,Edit:2,Add:4,Delete:8,审核:16LZ 考虑将module_id 所有可能值建立匹配关系如何?3,1和2
7 1、2、4
...确定这个后,对应module_id 进行拆分列值,role_id module_id
1 7
拆分后,
role_id module_id
1 1
1 2
1 4然后去除重复数据。即可。字符串拆分列表参考
--SQL2000/2005字符串拆分为列表通用函数
IF OBJECT_ID('f_getstr') IS NOT NULL
DROP FUNCTION f_getstr
GO
CREATE FUNCTION f_getstr(
@s NVARCHAR(4000), --待分拆的字符串
@flag NVARCHAR(10)='' --数据分隔符
)RETURNS @r TABLE(col NVARCHAR(1000))
AS
BEGIN
IF ISNULL(@flag,'')='' AND LEN(ISNULL(@flag,'')+'a')=1
INSERT @r
SELECT SUBSTRING(@s,number+1,1)
FROM master..spt_values
WHERE TYPE='p' and number<LEN(@s+'a')-1
ELSE
INSERT @r
SELECT SUBSTRING(@s,number,CHARINDEX(@flag,@s+@flag,number)-number)
FROM master..spt_values
WHERE TYPE='p' and number<=len(@s+'a')
--AND SUBSTRING(@flag+@s,number,1)=@flag --用此条件或下面的条件均可
AND CHARINDEX(@flag,@flag+@s,number)=number
RETURN
END
GO
这个Value是每模块的n个功能的和。不过OrchidCat提的拆分我倒可以研究研究的。
Module_id vi ed ad de Ch User_id
mdAdjust 0 2 0 0 0 88092
mdBeginStocks 0 0 0 0 16 88092
mdCustomer 0 0 0 8 0 88092
mdPoIn 0 0 0 0 16 88092
mdSaleOut 0 0 0 0 16 88092
mdSaleOut 0 2 0 0 0 88092
mdSaleOut 0 0 0 8 0 88092
mdSuppId 1 0 0 8 0 88092
mdSuppId 0 2 0 0 0 88092
无法用distinct去除重复,我想如果建一个临时表
module_id Value User_id
然后逐个(按1,2,4,8,16...分别)进行按位与运算,然后在这个临时表中去除重复,再将value进行按w位或求出Value值。是这样吗?我本来想通过一个简单查询得到结果的,现在看来要用存储过程了。
还有什么好方法吗?
access 许多语法与MS SQL 不一样,需要注意。
查看:1,Edit:2,Add:4,Delete:8,审核:16个人的观点:
你的这个权限设定是不是移植别人的?
二进制ASCII对照表,看看这个,是不是对你有启发
1的ASCII是00000001
2的ASCII是00000010
4的ASCII是00000100
8的ASCII是00001000
16的ASCII是00010000
31的二进制ASCII是00011111
根据第一位的0,1判断‘查看’权限
根据第二位的0,1判断‘Edit’权限
根据第三位......具体的可以去测试下,如果想了解详细理论的联系我
QQ:511683001
可以一起讨论下,因为我只是了解理论,具体的实现没有做过