2017-02-12 283 views
1

我在SQL中有一个安全表,其中2列是有价值的,列可以指示以下任何信息,每个用户可能存在多个L或D选项,值列中的值,如果L或D将指示用户可以访问或不访问的仓库列表,则类似的All将意味着用户可以访问所有仓库,而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表数据:

Security Table results

记住类同TypeOption = A为允许分支的列表,可能会有TypeOption = D的用户列出拒绝的麸皮CHES。

我需要筛选我的分支表查询以仅显示用户有权访问的分支。如果我把它分成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') 
)