我对系统权限管理有以下几个表:1、(角色表)tblRolesrole_id role_name pid
1 角色一 0
11 角色二 1
111 角色三 11
2 角色四 0
...... 2、(角色用户分配表)tblAssign
role_id user_Id
111 test
2 test
......3、(权限分配表)
role_id add delete update
11 0 1 0
111 1 0 0
2 0 0 1
......这里有两个问题,请高手指教:
1、角色有层级关系,如果用户隶属一个子角色,那他便继承父角色的权限,如何通过SQL语读出某一用户隶属的所有角色?如:test用户隶属的角色便有(1,11,111,2)
2、因为test用户隶属于1,11,111,2角色,那它的权限便是这几个角色加起来的总和,能否通过SQL语句直接返回“或运算”之后的结果呢?如test用户得到的权限便有:
add delete update
1 1 1
1 角色一 0
11 角色二 1
111 角色三 11
2 角色四 0
...... 2、(角色用户分配表)tblAssign
role_id user_Id
111 test
2 test
......3、(权限分配表)
role_id add delete update
11 0 1 0
111 1 0 0
2 0 0 1
......这里有两个问题,请高手指教:
1、角色有层级关系,如果用户隶属一个子角色,那他便继承父角色的权限,如何通过SQL语读出某一用户隶属的所有角色?如:test用户隶属的角色便有(1,11,111,2)
2、因为test用户隶属于1,11,111,2角色,那它的权限便是这几个角色加起来的总和,能否通过SQL语句直接返回“或运算”之后的结果呢?如test用户得到的权限便有:
add delete update
1 1 1
解决方案 »
- 本地IIS,上传文件,找不到路径的一部分。
- asp.net获取 tinyint(1) 类型的值
- 如何使calendar显示周次
- asp中使网页不能后退 刷新 关闭
- 本论坛上面的首页,新闻,论坛,群组,BLOG,文档等叫什么东西呀如何实现下面的内容换而它不换呢。
- 如何用.net获取字符串里所有URL
- 高手指点一下。
- textbox里的字符和数据库里的字符比较的问题,各位大哥大姐请帮忙看一下
- 好象是IE缓存问题!(急!!请高手帮忙)
- 怎么我的freeTextBox,还有普通的textbox都绑定RequiredFieldValidator不起作用.
- asp.net 不重新发送信息 则无法刷新网页
- ajax问题
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'
GOCREATE FUNCTION f_Pid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.PID,@Level
FROM tb a,@t_Level b
WHERE a.ID=b.ID
AND b.Level=@Level-1
END
RETURN
END
GO
--上面的用户定义函数可以处理一个节点有多个父节点的情况,对于标准的树形数据而言,由于每个节点仅有一个父节点,所以也可以通过下面的用户定义函数实现查找标准树形数据的父节点。
CREATE FUNCTION f_Pid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3))
AS
BEGIN
INSERT @t_Level SELECT @ID
SELECT @ID=PID FROM tb
WHERE ID=@ID
AND PID IS NOT NULL
WHILE @@ROWCOUNT>0
BEGIN
INSERT @t_Level SELECT @ID
SELECT @ID=PID FROM tb
WHERE ID=@ID
AND PID IS NOT NULL
END
RETURN
END
呵呵,第一个问题我已经通过循环的方式解决了,现在第二个,不知能不能实现!add delete update
0 1 0
1 0 0
1 1 0否能把若干行的值通过"或运算"组合起来呀?
如把上面的示例,返回:
add delete update
1 1 0
FROM 角色表 A, 角色用户分配表 B, 权限分配表 C
WHERE A.role_id = C.role_id
AND A.role_id = B.role_id
AND B.user_id = 'test'
如果是 oracle 就可以直接使用 connect by ... start with 之际得到所隶属的角色树
FROM 角色表 A, 角色用户分配表 B
WHERE A.role_id = B.role_id
AND B.user_id = 'test'
START WITH ...
CONNECT BY ...
我用的是 Ms Sql,第1个问题实现的方式,之前想用游标+循环来实际递归,后面没试出来,就只接用循环搞定了.
第2个问题,由于存的是布尔类型,max无效.但我先转成tinyint再来max,也实现了.虽然问题自己解决了,
但还是非常感谢大家!