Sql 用于搜索授予用户的访问权限的存储过程

Sql 用于搜索授予用户的访问权限的存储过程,sql,sql-server,sql-server-2005,sql-server-2008,sql-server-2000,Sql,Sql Server,Sql Server 2005,Sql Server 2008,Sql Server 2000,我想显示为特定模块的用户提供的访问权限 我有七个表,如角色访问、角色、功能、模块、子模块、公司和单位。RoleAccess是主表 给定的访问权限将仅存储在RoleAccess表中 RoleAccess表包含以下列,如RoleID、CompanyID、UnitID、FunctionID、ModuleID、SubModuleID、Create、Update、Delete、Read、Approve。这里创建、更新、删除、读取和批准是标志 公司表有两列,如CompanyID和CompanyName 单

我想显示为特定模块的用户提供的访问权限

  • 我有七个表,如角色访问、角色、功能、模块、子模块、公司和单位。RoleAccess是主表
  • 给定的访问权限将仅存储在RoleAccess表中
  • RoleAccess表包含以下列,如RoleID、CompanyID、UnitID、FunctionID、ModuleID、SubModuleID、Create、Update、Delete、Read、Approve。这里创建、更新、删除、读取和批准是标志
  • 公司表有两列,如CompanyID和CompanyName
  • 单位表有三列,如UnitID、UnitName和CompanyID
  • Roles表有四列,如RoleID、RoleName、CompanyID和UnitID
  • 模块表有两列,如ModuleID和ModuleName
  • 子模块表有三列,如ModuleID、SubModuleID、SubModuleName
  • Functions表有五列,如FunctionID、FunctionName、ModuleID和SubModuleID
我想在RoleAccess表中显示以下记录

 ModuleName, SubModuleName, FunctionName,
CompanyID, RoleID, UnitID, FunctionID, ModuleID, SubModuleID,
Create_f, Update_f, Delete_f, Read_f and Approve_f.  
如果RoleAccess表中不存在RoleID,则它将像往常一样显示所有记录,但标志列为零

我已经编写了一个存储过程,但它根据RoleAccess表中存储的RoleID显示记录。但我还希望将未存储在RoleAccess表中的角色的标志显示为0

我想要这个的存储过程。任何人请帮助我

下面给出了我的存储过程。其中一些模块有两个或更多子模块。我无法显示搜索结果中的所有子模块。如果只出现一个子模块,则它将给出正确的结果。请帮帮我

CREATE PROCEDURE [dbo].[SEC_GetAccessRight]
@CompanyID INT,
@UnitID Int,
@RoleID INT,
@ModuleID INT
AS
BEGIN

SELECT DISTINCT Module.ModuleName,
                SubModule.SubModuleName, 
                Functions.FunctionName,
                Functions.FunctionDescription,
                RoleAccess.CompanyID,
                RoleAccess.UnitID, 
                RoleAccess.RoleID, 
                Functions.FunctionID, 
                Module.ModuleID, 
                SubModule.SubModuleID,
                ISNULL(RoleAccess.Create_f, 0)      AS [CREATE],
                ISNULL(RoleAccess.Update_f, 0)      AS [UPDATE],
                ISNULL(RoleAccess.Delete_f, 0)      AS [DELETE],
                ISNULL(RoleAccess.Read_f, 0)        AS [READ],
                ISNULL(RoleAccess.Approval_f, 0)    AS [APPROVE]    
FROM Module INNER JOIN SubModule 
ON Module.Moduleid = SubModule.Moduleid INNER JOIN Functions
ON Module.Moduleid = Functions.Moduleid AND SubModule.SubModuleid = Functions.SubModuleid 
LEFT OUTER JOIN
roleaccess ON roleaccess.Moduleid = Module.Moduleid AND roleaccess.SubModuleid = SubModule.SubModuleid
AND Functions.Functionid = roleaccess.Functionid 
WHERE Module.ModuleID = (SELECT DISTINCT Module.ModuleID FROM Module INNER JOIN SubModule
on SubModule.ModuleID = Module.ModuleID LEFT OUTER JOIN
RoleAccess ON RoleAccess.ModuleID = Module.ModuleID AND RoleAccess.SubModuleID = SubModule.SubModuleID
WHERE Module.ModuleID = @ModuleID)
 AND RoleAccess.RoleID = @RoleID OR RoleAccess.RoleID IS NULL
AND RoleAccess.ModuleID IS NOT NULL AND RoleAccess.SubModuleID IS NULL
END

您的代码包含一个bug

对RoleAccess执行左连接,这是正确的

LEFT OUTER JOIN roleaccess ON roleaccess.Moduleid = Module.Moduleid 
         AND roleaccess.SubModuleid = SubModule.SubModuleid
AND Functions.Functionid = roleaccess.Functionid 
就其本身而言,这将导致RoleAccess返回行,如果没有找到匹配项,则将从表中获得一个空行集(这就是ISNULL函数所寻找的)

但是,稍后将在WHERE子句中引用角色访问。这基本上击败了左连接

WHERE Module.ModuleID = @ModuleID)
 AND RoleAccess.RoleID = @RoleID OR RoleAccess.RoleID IS NULL
AND RoleAccess.ModuleID IS NOT NULL AND RoleAccess.SubModuleID IS NULL
尝试将RoleID条件移动到join中,而不是WHERE中,看看这是否解决了您的问题

左连接应如下所示:

LEFT OUTER JOIN roleaccess ON roleaccess.Moduleid = Module.Moduleid 
             AND roleaccess.SubModuleid = SubModule.SubModuleid
             AND Functions.Functionid = roleaccess.Functionid 
             AND RoleAccess.RoleID = @RoleID 

请把问题的格式弄清楚一点,给我们看看你写的问题,告诉我们问题出在哪里。这是不可能的。发布实际的表创建DDL。我已经编辑并发布了我的存储过程。请查看它。您希望它在3个版本的SQL Server上运行吗?我使用的是SQL Server 2005。我需要你的帮助。