Хранимая процедура для поиска прав доступа, предоставленных пользователям - PullRequest
0 голосов
/ 24 декабря 2010

Я хочу отобразить Права доступа, предоставленные Пользователям для конкретного модуля.

  • У меня есть семь таблиц, таких как RoleAccess, Roles, Functions, Module, SubModule, Company и Unit. RoleAccess является главной таблицей.
  • Данные AccessRights будут храниться только в таблице RoleAccess.
  • Таблица RoleAccess имеет следующие столбцы, такие как RoleID, CompanyID, UnitID, FunctionID, ModuleID, SubModuleID, Создать, Обновить, Удалить, Читать, Одобрить. Здесь Create_f, Update_f, Delete_f, Read_f и Approve_f являются флагами.
  • Таблица компании состоит из двух столбцов, таких как CompanyID и CompanyName.
  • Таблица единиц измерения имеет три столбца, такие как UnitID, UnitName и CompanyID.
  • Таблица ролей имеет четыре столбца, таких как RoleID, RoleName, CompanyID и UnitID.
  • Таблица модулей имеет два столбца, таких как ModuleID и ModuleName.
  • Таблица SubModule имеет три столбца, такие как ModuleID, SubModuleID, SubModuleName.
  • Таблица функций имеет пять столбцов, таких как 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.  

Если RoleID не существует в таблице RoleAccess, он будет отображать все записи, как обычно, но со столбцами флага, равными нулю.

Я видел одну хранимую процедуру, но она отображает записи, основанные на RoleID, хранящемся в таблице RoleAccess. Но я также хочу отобразить флаги как 0 для ролей, не сохраненных в таблице RoleAccess.

Я хочу Хранимую Процедуру для этого. Любой, пожалуйста, помогите мне.

Моя хранимая процедура приведена ниже. В этом часть модуля имеет два или более подмодулей. Я не могу отобразить все подмодули в результатах поиска. Если есть только один субмодуль, то он даст правильный результат. Пожалуйста, помогите мне.

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

1 Ответ

1 голос
/ 24 декабря 2010

Ваш код содержит ошибку ...

Вы делаете левое соединение с RoleAccess, что является правильным.

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

Само по себе это приведет к тому, что строки будут возвращены из RoleAccess, и если совпадение не найдено, вы получите пустой набор строк из таблицы (что и ищет ваша функция ISNULL)

Однако позже вы будете ссылаться на ROLE ACCESS в предложении 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 в соединение, а не ГДЕ, и посмотрите, решит ли это вашу проблему ...

LEFT JOIN должен выглядеть так:

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