读取权限的SQL设计,急,急,急!!!
我对系统权限管理有以下几个表:
1、(角色表)tblRoles
role_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
[解决办法]
用函数嘛,肯定可以达到你要的要求,你这题目太长了,看得我太累了。
[解决办法]
--测试数据
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 ', '小分市 '
GO
CREATE 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
[解决办法]
mark
[解决办法]
先接分
[解决办法]
同意楼上的
[解决办法]
看了看,除了使用游标好像没合适的方法..
[解决办法]
学习,
接分
[解决办法]
由于你权限是使用0,1表示,所以获取数据就比较简单了
SELECT MAX(C.Add) AS Add, MAX(C.Delete) AS Delete, MAX(C.Update) AS Update
FROM 角色表 A, 角色用户分配表 B, 权限分配表 C
WHERE A.role_id = C.role_id
AND A.role_id = B.role_id
AND B.user_id = 'test '
[解决办法]
直接使用 MAX 就可以了,因为1比0大啊,呵呵~~~
[解决办法]
用 "或 "的目的是什么?
[解决办法]
对于第一个问题,我不知道楼主使用的是什么数据库
如果是 oracle 就可以直接使用 connect by ... start with 之际得到所隶属的角色树
[解决办法]
SELECT SYS_CONNECT_BY_PATH(A.pid, ', ') || ', ' || A.role_id AS roleid
FROM 角色表 A, 角色用户分配表 B
WHERE A.role_id = B.role_id
AND B.user_id = 'test '
START WITH ...
CONNECT BY ...
[解决办法]
题目意思明白了,但是,还没想出来思路, 先看
[解决办法]
点点 ...
好长..不看
接分...
[解决办法]
解决就好啊!