セキュリティテーブルが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
への似を忘れないでください
:
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')
私はこれがもっと意味があると思います。
はあなたがSELECTブロックを含む完全なクエリテキストを投稿できますか? – andrews
セキュリティテーブルの名前、スキーマ、サンプルデータ、「AllowDisallowNone」機能のコード(機能ではないのですか?)、予想されるクエリ結果のケースなどの詳細を教えてください。 – andrews