Службы Reporting Services - динамически выбирать правильный источник данных / динамически изменять предложение WHERE? - PullRequest
0 голосов
/ 17 февраля 2010

У меня есть мозги для всех вас, гуру отчетности по SQL Server 2008: -)

У меня есть отчет, который отображает кучу данных, в том числе UserID и OrgUnitID для пользователей. Это отчет сервера, который я отображаю на сервере из приложения ASP.NET.

Мое требование:

  • «обычный» пользователь может видеть только свои собственные строки данных (в основном
    SELECT (fields) FROM dbo.DataView WHERE UserID = @UserID)

  • привилегированный пользователь может видеть всех своих подчиненных; У меня есть табличная функция, которая обеспечивает эту функциональность (в основном SELECT (fields) FROM dbo.DataView<br> INNER JOIN dbo.OrgHierarchy ON DataView.OrgUnitID = OrgHierarchy.OrgUnitID)

Оба сценария сами по себе работают нормально - проблема в том, что я должен объединить их в один отчет.

Как я могу это сделать ?? Как получить отчет, который динамически, на основе параметра отчета, который я передаю (@UserLevel; 0 = обычный пользователь, 1 = привилегированный), использует один или другой запрос ??

Мне не очень хочется динамически переписывать SQL-запрос .... какие-нибудь другие идеи ??

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

  • Тогда я надеялся, что смогу добавить фильтр к своему набору данных в моем отчете о сервере динамически из моего клиентского приложения - но это тоже не представляется возможным, ..... может я создать фильтр для параметра «UserID = @UserID» и каким-то образом включить / отключить его при необходимости во встроенном VB-коде в самом отчете?

Кто-нибудь принимает? Дикие нестандартные мысли? Дайте мне знать!

Ответы [ 2 ]

1 голос
/ 17 февраля 2010

вы можете попробовать сделать один запрос, который работает для всех? Вот лишь предположение на основе таблицы / столбцов, которые вы включили в свой вопрос:

--always returns the data for the one given @UserID
SELECT
    (fields) 
    FROM dbo.DataView 
    WHERE UserID = @UserID
UNION
--only returns data for the subordinates of @UserID, nothing if there are none
SELECT
    (d2.fields)
    FROM dbo.DataView               d1 
        INNER JOIN dbo.DataView     d2 ON d1.OrgUnitID = d2.OrgUnitID 
        INNER JOIN dbo.OrgHierarchy  h ON d1.OrgUnitID = h.OrgUnitID
    WHERE d1.UserID = @UserID and d1.UserLevel=1
0 голосов
/ 12 июля 2012

Вы можете попробовать определить табличную функцию, которая хранит всю логику на основе пользователя (либо db_user, либо report_user)

CREATE  FUNCTION [dbo].[get_employee_data](@UserId nvarchar(200))   
RETURNS TABLE
AS
  RETURN
   (
        SELECT   *
        FROM    yourdata
        where @UserId = yourdata.user_id and ....

   )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...