2017-02-12 15 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'))) 

これをより効果的にする方法についての提案はありますか?

[OK]を二つのテーブルにいくつかの詳細:用TypeOption = Aへの似を忘れないでください

Security Table results

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

セキュリティ・テーブル・データ:

セキュリティテーブルは次のようになります許可されたブランチのリスト、拒否されたふすまのリストのための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') 
) 
関連する問題