У нас была похожая проблема, и мы закончили писать функцию в SQL.
Функция сделала следующее:
- Получен параметр имени пользователя от SRSS
- Выполнен поиск в таблице разрешений и получены записи (идентификаторы отдела в вашем случае).
- вернул идентификатор отдела
Тогда наше SQL-выражение выглядело так:
ВЫБРАТЬ *
ИЗ важных данных
ГДЕ DepartmentId IN (ВЫБЕРИТЕ Id ИЗ fn_GetUserDepartmentAllocations (@UserName))
Это заставило нас изменить все SQL-запросы, но позволило сделать это с минимальной сложной логикой.
Другая вещь, которую это позволяет, - это если у вас есть один пользователь, который выходит за границы отдела: например, менеджер двух отделов.
CREATE FUNCTION [dbo].[fn_GetUserDepartmentAllocations]
(
@UserName NVARCHAR(100)
)
RETURNS
@TempPermissions TABLE
(
DepartmentId Int
)
AS
BEGIN
INSERT INTO @TempPermissions
SELECT DepartmentId
FROM DepartmentPermissions
WHERE DepartmentAllowedUsername = @UserName
RETURN
END
Основным преимуществом такой работы является то, что она также позволяет вам редактировать одно место для изменения всей структуры разрешений, вам не нужно просматривать каждый отчет, чтобы изменить его, вместо этого вы меняете одно место
Например, у вас может быть менеджер, который принадлежит к двум отделам, но ему не разрешено просматривать их, кроме как в четверг (я знаю глупый пример, но, надеюсь, вы поняли это).
Надеюсь, это поможет
Пит