Security
には、特定のNTFSファイルシステムスキャンのアクセスビットマスクが格納され、よく知られているビットマスクの文字列表現に相当するFileSystemRights
という2つのテーブルがあります。私は、与えられたビットマスクの期待される(適切ではない)文字列表現を公開するビューを作成する必要があります。問題はいくつかの列挙型の値の複合であり、より低い値の組み合わせを含んでいるので、暗黙の値を繰り返すことは望ましくありません。複雑なSQLiteビューの選択
例えば、1179817(Security.Id = 24)の値のみを読むEXECUTEFILE、ListDirectory、を除く、ReadAndExecuteと同期を報告する必要があり、ReadAttributes、リードデータ、 ReadExtendedAttributes,ReadPermissionsおよびトラバースはすべての一部ですeadAndExecute(例: ReadAndExecute & == を読んでください。を読んでください)。そのすべてを表示するのは明らかに正しいですが、ユーザは暗黙的でない値を見ることだけを望みます。
私はSQLの制約の中で、見た目が悪い深刻なネストされたケースなしで、このように動作する結合を生成することができません。
より良いプログラムアプローチが存在しますか?
FileSystemRights
================
Id Name Value
-- ---- -----
1 None 0
2 ListDirectory 1
3 ReadData 1
4 WriteData 2
5 CreateFiles 2
6 CreateDirectories 4
7 AppendData 4
8 ReadExtendedAttributes 8
9 WriteExtendedAttributes 16
10 ExecuteFile 32
11 Traverse 32
12 DeleteSubdirectoriesAndFiles 64
13 ReadAttributes 128
14 WriteAttributes 256
15 Write 278
16 Delete 65536
17 ReadPermissions 131072
18 Read 131209
19 ReadAndExecute 131241
20 Modify 197055
21 ChangePermissions 262144
22 TakeOwnership 524288
23 Synchronize 1048576
24 FullControl 2032127
25 GenericAll 268435456
26 GenericExecute 536870912
27 GenericWrite 1073741824
28 GenericRead 2147483648
Security
========
Id FileSystemRights IdentityReference
-- ---------------- -----------------
20 2032127 BUILTIN\Administrators
21 2032127 BUILTIN\Administrators
22 2032127 NT AUTHORITY\SYSTEM
23 268435456 CREATOR OWNER
24 1179817 BUILTIN\Users
25 4 BUILTIN\Users
26 2 BUILTIN\Users
MyView
======
SELECT s.Id AS SecurityId,
f.Name
FROM Security s
JOIN FileSystemRights f
ON CASE f.Value
WHEN 0 THEN s.FileSystemRights = f.Value
ELSE (s.FileSystemRights & f.Value) == f.Value
END
ORDER BY s.Id, f.Name;
: は、次に別の値のサブセットである同じエントリの値をフィルタリングすることの周りに別のクエリを包みます(すべての側面を示す)と望ましい出力を示します。 SQLIteの場合、MCVEにはSQLiteデータベースの '.dump'が含まれています。 何が似ているかを指摘してください。 – Yunnosch