あなたの Permissions 列は Int だと思います。そうである場合は、以下に示すサンプル コードを試してみることをお勧めします。これにより、機能がどのように機能するかが明確に示されます。
Declare @Temp Table(Permission Int, PermissionType VarChar(20))
Declare @CanRead Int
Declare @CanWrite Int
Declare @CanModify Int
Select @CanRead = 1, @CanWrite = 2, @CanModify = 4
Insert Into @Temp Values(@CanRead | @CanWrite, 'Read,write')
Insert Into @Temp Values(@CanRead, 'Read')
Insert Into @Temp Values(@CanWrite, 'Write')
Insert Into @Temp Values(@CanModify | @CanWrite, 'Modify, write')
Insert Into @Temp Values(@CanModify, 'Modify')
Select *
From @Temp
Where Permission & (@CanRead | @CanWrite) > 0
Select *
From @Temp
Where Permission & (@CanRead | @CanModify) > 0
論理積を使用すると、条件に応じて 1 が適切に設定された数値が得られます。何も一致しない場合、結果は 0 になります。1 つ以上の条件が一致する場合、結果は 0 より大きくなります。
例を示しましょう。
CanRead = 1、CanWrite = 2、および CanModify = 4 とします。有効な組み合わせは次のとおりです。
Modify Write Read Permissions
------ ----- ---- -----------
0 0 0 Nothing
0 0 1 Read
0 1 0 Write
0 1 1 Read, Write
1 0 0 Modify
1 0 1 Modify, Read
1 1 0 Modify, Write
1 1 1 Modify, Write, Read
ここで、読み取りまたは変更をテストするとします。アプリから (CanRead | CanModify) を渡します。これは 101 (2 進数) になります。
最初に、これを ONLY が読み取ったテーブルの行に対してテストしてみましょう。
001 (Row from table)
& 101 (Permissions to test)
------
001 (result is greater than 0)
では、書き込みしかない行に対してテストしてみましょう。
010 (Row from table)
& 101 (Permission to test)
------
000 (result = 0)
次に、3 つの権限すべてを持つ行に対してテストします。
111 (Row from table)
& 101 (Permission to test)
------
101 (result is greater than 0)
AND 演算の結果が値 = 0 になった場合、テストされた権限のいずれもその行に適用されないことがわかります。値が 0 より大きい場合、少なくとも 1 つの行が存在します。