2009-08-25 5 views
0

사용자가 보고서를 만들 수 있도록하려는 일련의 레코드 (주문)가 있습니다.SQL Server Reporting Services, 필터 적용 방법

사용자가 다른 부서에서 온 것이므로 각 부서에서 자신의 물건 만 볼 수 있도록 만들고 싶습니다.

이 방법을 올바르게 수행하는 방법을 알 수 없습니다.

내가 지금 가지고있는 것 : - 내가 주문 테이블에 필터를 놓은 모델.

필터는 GetUserID()를 사용하여 사용자 이름을 얻을 수 있지만 사용자를 특정 부서에 매핑하는 "UserDepartment"테이블로 이동하는 방법을 알 수는 없습니다.

물론, 새로운 액세스 그룹을 만들거나 누군가가 꿈꿀 수있는 각 부서의 모델을 편집 할 필요가없는 솔루션을 선호합니다.

실마리가 있습니까?

EDIT (SQL 서버 2008을 사용)

:이 링크 http://blogs.msdn.com/bobmeyers/articles/Implementing_Data_Security_in_a_Report_Model.aspx 내가 할 노력하고있어의 기본을 보여 주지만, 저자는 각 레코드가 일치 할 수있는 사용자 이름 필드가 있다고 가정하는 것 같다.

내 경우에는 부서 X의 모든 사용자가 회선에 액세스 할 수 있기를 원합니다.

+1

사용자/userdepartment과 주문 사이의 연결은 무엇을하는 데 도움이? – gbn

+0

각 주문에는 주문을 소유 한 부서의 DepartmentId가 있습니다. – Soraz

답변

0

사용자가 주문한 것으로 가정합니다. 따라서 필터 사용자와 동일한 부서에있는 사용자별로 필터링하십시오. 주문을 직접 필터링하지 마십시오.

내가 스키마 및 열 이름에서 짐작 : 당신은 아이디어를 얻을 hoep ...

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 
+0

SRSS 용 모델을 만들 때 필터 및 필드를 모델에 추가 할 수 있으며, 차례로 자체 SQL을 만듭니다. 이것은 동일한 것입니까? SQL을 사용하여 데이터 소스를 정의하면 모델의 GetUserID()를 사용할 수 없게됩니다. – Soraz

+0

죄송합니다. SSRS에서 모델을 사용하지 않았습니다. 어쨌든 이것은 데이터 함수입니다 : 집합 기반 조인/필터 및 보고서 자체에서 할 필요는 없습니다. – gbn

+0

@Soraz : 여전히 사용자 ID를 매개 변수로 데이터 소스에 전달할 수 있습니까? – Faiz

0

무엇을 달성하려고하는 것은 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 

이는 각 사용자에 대해, 당신에게 순서의 기본적 사본을 더 행을 줄 것이다 부서를 소유하고 있습니다.

이제 제공된 링크에 설명 된대로 필터를 적용 할 수 있습니다. 이렇게하면 현재 사용자가 올바른 부서에있는 경우 해당 사용자의 주문 행 사본 한 개로 필터링됩니다.

성능상의 문제가있는 경우 ASP.NET, WinForms 또는 WPF에서 로컬 보고서 (.RDLC)를 사용하고 사용자 세부 정보를 데이터 호출에 전달하는 것이 가장 쉬운 다른 방법이 있습니다. 즉, 필터링을 SQL.

1

우리는 이와 비슷한 문제가있어서 SQL에서 함수를 작성하게되었습니다. SRSS

  • 에서 사용자 이름 매개 변수를 수신

    1. 가 권한 테이블에 조회를 수행하고 (귀하의 경우 부서 ID를) 레코드를 검색 :

      기능은 다음했다.

    2. 부서를 반환 아이디의

  • 그런 다음 우리의 SQL 문은 다음과 같이 보았다 :

    SELECT * ImportantData 어디에서 DepartmentId IN (fn_GetUserDepartmentAllocations FROM SELECT 아이디 (@ 사용자))

    이했다 모든 SQL 쿼리를 수정하도록 강요하지만 최소한의 복잡한 로직으로 처리 할 수있었습니다.

    다른 하나는 부서 경계를 초월한 한 명의 사용자가있는 경우입니다 (예 : 2 개 부서의 관리자).

    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 
    

    그것을 그것은 또한 당신이 전체 권한 구조를 변경 한 곳을 편집 할 수있다 이런 식으로 일을의 주요 장점은 대신 변경, 변경하는 각각의 모든 보고서를 통해 갈 필요가 없습니다 one place

    예를 들어 2 개 부서에 속한 관리자가있을 수 있지만 thursdays를 제외하고는 해당 관리자를 볼 수 없습니다 (바보 같은 예를 알고 있지만 잘하면 포인트를 얻음).

    희망이

    피트

    관련 문제