日期:2014-05-18  浏览次数:20467 次

百分求解:如何进行逻辑运算
因为各种关系需要在MS-SQL2000数据库实现该运算,问题是这样的:

我要列出一个用户的所有权限,经过查询得到两个数据集:
select   [权限ID],[许可]   form   用户权限表   where   工号=1234
select   [权限ID],[许可]   form   角色权限表   where   工号=1234
select   [权限ID],[许可]   form   群组权限表   where   工号=1234

上面这三个数据集中“权限ID”都是同一个表的外键,“许可”只有true、false两种数值或空值,在表中用1和0、null表示。


我想请问:如何将上面两张表结合起来
条件如下:当“许可”中值不一致、或其中一个结果集中没有记录、或出现空值时,按从大到小的优先级“用户权限表”、“群组权限表”、“角色权限表”进行取值。

比如当“许可”为以下值时:
用户权限表       角色权限表       群组权限表       结果
----------------------------------------------------
true                   true                   true                   true
false                 true                   true                   false
null                   false                 true                   false
null                   null                   true                   true
null                   null                   null                   (不输出)

------解决方案--------------------
你给的列举并不全面。
比如角色权限为false时,是否就决定了结果为false,还是看用户是否有权限。

简单的问题
设usr1隶属于user组,winnt系统下默认他没有安装应用程序权限,但修改usr1权限为usr1指定应用程序安装权限时,尽管user组没有权限,但这个特定用户有权限。
反之.adm1处于administrators组,当修改其权限或更改系统安全策略时,adm1可能不具有administrators本身默认具有的权限.

你给的那些列举结果并不能表示清楚你想要的东西。
------解决方案--------------------
create proc AXX @工号 varchar(10) as
select A.[权限ID],(case when A.[许可] is not null then A.[许可] when B.[许可] is null then ' ' else B.[许可] end ) 权限--,A.[许可],B.[许可]
from 角色权限表 A full join 用户权限表 B on A.[权限ID]=B.[权限ID] where 工号=@工号
---调用
exec AXX '1234 '
你不是说 1”、“0”、“空”我就当你的空是null了,就是没有记录的意思
如果你说的空是 ' '那么用isnull(A.[许可], ' ')处理一下好了,
有两处不明白,下面为什么不是true 呢
无记录 true false
你查两张表,怎么会出现两边都没记录的,不过这种情况也一样处理
无记录 无记录 (不显示