2017-02-12 6 views
1

SQL에 보안 테이블이 있고 2 개의 열이 값이며 열이 다음 정보 중 하나를 나타낼 수 있으므로 옵션 L 또는 D의 여러 항목이 사용자별로 존재할 수 있으며 값 열의 값 L 또는 D가 사용자가 액세스 할 수있는웨어 하우스 목록을 나타내면 유사 모두 사용자에게 모든웨어 하우스에 대한 액세스 권한이 있으며 None에는웨어 하우스 액세스 권한이 없음을 의미합니다.여러 사례 where 절

Option | Value 
--------------- 
A  | All 
N  | None 
L  | xyz (Allowed value) 
D  | xyz (Denied Value) 

내 문제는 SQL의 WHERE 절을하고, 나는 4 개 시나리오에 제공 할 필요가 지금까지 내가 전환 할 필요가 마지막 절을보고, 4 개 시나리오의 3 조항에만 수 있어요 옵션에 따라 IN과 NOT IN 사이.

WHERE 
    (CASE WHEN (SELECT TOP(1) Value FROM [AllowDisallowNone] ('demo1', 'ARBranches')) = 'All' 
       THEN 'All' END != Branch 
    OR 
    CASE WHEN (SELECT TOP(1) Value FROM [AllowDisallowNone] ('demo1', 'ARBranches')) = 'None' 
       THEN 'None' END = Branch 
    OR 
    Branch IN (SELECT Value FROM [AllowDisallowNone] ('demo1', 'ARBranches'))) 

더 효과적인 방법에 대한 제안이 있습니까? 좋아

두 테이블에 좀 더 세부 사항 :

SELECT [Operator] 
,[Type] 
,[TypeOption] 
,[Value] 
FROM [_OperatorAccess] 
WHERE [Type] = 'ARBranches' 

보안 테이블 데이터 :

보안 표는 다음과 같습니다

Security Table results

가에 대한 TypeOption = A에 그 비슷한 기억 허용 된 분기 목록에 거부 된 밀기울 목록에 대한 TypeOption = D의 사용자가있을 수 있습니다. 체스.

분기 테이블 쿼리를 필터링하여 사용자가 액세스 할 수있는 분기 만 표시하도록해야합니다. 이것을 4 개의 별도의 쿼리로 나눈다면 다음과 같이 될 것입니다 :

For TypeOption = A (All Records) 
Select Invoice, Branch, InvDate FROM Branches (No Where Clause necessary, because user have access to all Branches) 

For TypeOption = N (No Records) 
Select Invoice, Branch, InvDate FROM Branches WHERE Branch = '' (No Branches will be returned, becuase my Branch field cannot be null or empty.) 

For TypeOption = L (List of allowed branches) 
Select Invoice, Branch, InvDate FROM Branches WHERE Branch IN (Select Value FROM _OperatorAccess WHERE Operator = 'RWOL' AND Type = 'ARBranches') 

For TypeOption = D (List of denied branches) 
Select Invoice, Branch, InvDate FROM Branches WHERE Branch NOT IN (Select Value FROM _OperatorAccess WHERE Operator = 'RWOL' AND Type = 'ARBranches') 

나는 이것이 더 합리적이라고 희망합니다.

+0

당신이 SELECT 블록을 포함한 전체 쿼리 텍스트를 게시 할 수 있을까? – andrews

+0

보안 테이블의 이름, 스키마 및 샘플 데이터, "AllowDisallowNone"함수의 코드 (함수일까요?) 및 예상되는 쿼리 결과의 사례와 같은 자세한 정보를 제공해주십시오. – andrews

답변

0
EXISTS 절에 서브 쿼리를 변경

:

SELECT * 
FROM my_existing_query q 
WHERE EXISTS (

    SELECT 1 
    FROM [AllowDisallowNone] ('demo1', 'ARBranches') 
    WHERE 
    -- All warehouses permitted, or specific warehouse permitted 
     (Value = 'All' AND Option = 'A') 
    OR (Value = q.Branch AND Option = 'L') 

    -- Deny permissions should override Allow permissions 
    EXCEPT 

    SELECT 1 
    FROM [AllowDisallowNone] ('demo1', 'ARBranches') 
    WHERE 
    -- No warehouses permitted 
     (Value = 'None' AND Option = 'N') 
    OR (Value = q.Branch AND Option = 'D') 
)