Службы отчетов SQL Server, как лучше применять фильтры - PullRequest
0 голосов
/ 25 августа 2009

У меня есть куча записей (заказов), которые я хочу сделать доступными для пользователей, чтобы создавать отчеты.

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

Я не могу понять, как сделать это правильно.

Что у меня сейчас есть: - Модель, в которой я разместил фильтр на столе заказа.

Фильтр может использовать GetUserID () для получения имени пользователя, но я не могу понять, как перейти от этого к таблице "UserDepartment", которая отображает пользователей в определенные отделы.

Конечно, я бы предпочел решение, при котором мне не нужно было создавать новые группы доступа или редактировать модель для каждого отдела, который кто-то может придумать.

Есть какие-нибудь подсказки?

(с использованием SQL Server 2008)

РЕДАКТИРОВАТЬ: Эта ссылка http://blogs.msdn.com/bobmeyers/articles/Implementing_Data_Security_in_a_Report_Model.aspx показывает основы того, что я пытаюсь сделать, но автор, кажется, предполагает, что каждая запись имеет поле UserName, которое может быть сопоставлено.

В моем случае я хочу, чтобы все пользователи отдела X имели доступ к линии.

Ответы [ 3 ]

1 голос
/ 11 сентября 2009

У нас была похожая проблема, и мы закончили писать функцию в SQL.

Функция сделала следующее:

  1. Получен параметр имени пользователя от SRSS
  2. Выполнен поиск в таблице разрешений и получены записи (идентификаторы отдела в вашем случае).
  3. вернул идентификатор отдела

Тогда наше 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

Основным преимуществом такой работы является то, что она также позволяет вам редактировать одно место для изменения всей структуры разрешений, вам не нужно просматривать каждый отчет, чтобы изменить его, вместо этого вы меняете одно место

Например, у вас может быть менеджер, который принадлежит к двум отделам, но ему не разрешено просматривать их, кроме как в четверг (я знаю глупый пример, но, надеюсь, вы поняли это).

Надеюсь, это поможет

Пит

0 голосов
/ 11 сентября 2009

То, что вы пытаетесь достичь, сложно с помощью метода GetUserID (). Чтобы использовать этот исходный запрос для возврата большого количества избыточных данных, представьте что-то вроде следующего:

/*
Table: User
Fields: UserID, LoginName, FullName

Table: Department
Fields: DepartmentID, Name

Table: UserDepartments
Fields: UserID, DepartmentID

Table: Order
Fields: OrderNumber, DepartmentID
*/

SELECT O.OrderNumber, O.DepartmentID, U.LoginName
FROM Order O
JOIN Department D ON D.DepartmentID = O.DepartmentID
JOIN UserDepartments UD ON UD.DepartmentID = D.DepartmentID
JOIN User U ON U.UserID = UD.UserID

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

Теперь вы можете применить свой фильтр, как описано в ссылке, которую вы предоставили. Это отфильтрует его до одной копии строк заказа для текущего пользователя, если они находятся в нужном отделе.

Если это проблема с производительностью, есть другие альтернативы, проще всего использовать локальный отчет (.RDLC) в ASP.NET, WinForms или WPF и передавать данные пользователя в вызов данных, чтобы фильтрация могла быть выполнена в SQL .

0 голосов
/ 25 августа 2009

Предполагается, что у пользователей есть заказы. Таким образом, фильтр по пользователям, которые находятся в том же отделе, что и пользователь фильтра. Не фильтруйте заказы напрямую.

Я догадался по именам схем и столбцов: да, вы поняли идею ...

SELECT
   MY STuff
FROM
   Order O
   JOIN
   UserDept UD ON O.UserCode = UD.UserCode
WHERE
   EXISTS (SELECT *
       FROM
           UserDept UD2
       WHERE
           UD2.UserCode = @MYUSerCode
           AND
           UD2.DeptID = UD.DeptID)

--or
SELECT
   MY STuff
FROM
   Order O
   JOIN
   UserDept D ON O.UserCode = D.UserCode
   JOIN
   UserDept U ON D.DeptID = U.DeptID
WHERE
   U.UserCode = @MYUSerCode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...