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
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。我需要你的帮助。