求权限查询的 SQL 语句。

zzmsl 2007-06-01 10:24:56
表结构如下,求 SQL 语句,查询所有角色拥有的权限!
如:
User Shop Select
Admin Shop Select
Admin Shop Update

Role 角色表
RoleID RoleName
1 User
2 Admin

PrivilegeInRole 角色与权限对应表
RoleID PrivilegeID
1 1
2 2
2 2

Privilege 权限表
PrivilegeID ResourceID OperationID
1 1 1
2 1 1
2 1 2

Resource 资源表
ResourceID Description
1 Shop

Operation 操作表
OperationID Description
1 Select
2 Update
...全文
389 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fa_ge 2007-06-02
  • 打赏
  • 举报
回复
角色表
create table Role

(RoleID smallint, RoleName varchar(10))
insert into Role
select 1, 'User' union
select 2, 'Admin'

角色与权限对应表
create table PrivilegeInRole
(RoleID smallint, PrivilegeID smallint)
insert into PrivilegeInRole
select 1, 1 union all
select 2, 2 union all
select 2, 2



权限表
create table Privilege

(PrivilegeID smallint, ResourceID smallint, OperationID smallint)
insert into Privilege
select 1, 1, 1 union all
select 2, 1, 1 union all
select 2, 1, 2
资源表
create table Resource

(ResourceID smallint, Description varchar(10))
insert into Resource
select 1, 'Shop'

操作表

create table Operation
(OperationID smallint,Description varchar(10))
insert into Operation
select 1, 'Select' union all
select 2, 'Update'



select distinct * from
(
select a.*,b.PrivilegeID from Role a left join PrivilegeInRole b on a.RoleID=b.RoleID
)a
left join
(
select b.Description,c.* from Operation b
left join
(
select a.Description as Description1,b.* from Resource a left join Privilege b on a.ResourceID=b.ResourceID
)c on b.OperationID=c.OperationID
)d on a.PrivilegeID=d.PrivilegeID


RoleID RoleName PrivilegeID Description Description1 PrivilegeID ResourceID OperationID
------ ---------- ----------- ----------- ------------ ----------- ----------
1 User 1 Select Shop 1 1 1
2 Admin 2 Select Shop 2 1 1
2 Admin 2 Update Shop 2 1 2

(所影响的行数为 3 行)
zzmsl 2007-06-01
  • 打赏
  • 举报
回复
老大。还是不行啊!
$扫地僧$ 2007-06-01
  • 打赏
  • 举报
回复
select R.RoleName,T.R_Description,T.O_Description
from PrivilegeInRole P,
Role R,
(
select P.PrivilegeID,R.Description as R_Description,O.Description as O_Description
from Privilege P,
Resource R,
Operation O
Where P.ResourceID = R.ResourceID
and P.OperationID=O.OperationID
)T
where P.RoleID=R.RoleID
and T.PrivilegeID=R.PrivilegeID
云中客 2007-06-01
  • 打赏
  • 举报
回复
把C去掉
zzmsl 2007-06-01
  • 打赏
  • 举报
回复
列前缀 'c' 与查询中所用的表名或别名不匹配!
-狙击手- 2007-06-01
  • 打赏
  • 举报
回复
select g.RoleName,f.Description1,f.Description2
from (
select e.RoleID ,d.*
from Role e
left join (
select PrivilegeID c ,a.Description as Description1 ,b.Description as Description2
from Privilege
left join Resource a on c.ResourceID = a.ResourceID
left join Operation b on c.OperationID = b.OperationID )d on e.PrivilegeID= d.PrivilegeID) f
left join Role g on g.RoleID = f.RoleID

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧