2017-04-09 9 views
1

Securityには、特定のNTFSファイルシステムスキャンのアクセスビットマスクが格納され、よく知られているビットマスクの文字列表現に相当するFileSystemRightsという2つのテーブルがあります。私は、与えられたビットマスクの期待される(適切ではない)文字列表現を公開するビューを作成する必要があります。問題はいくつかの列挙型の値の複合であり、より低い値の組み合わせを含んでいるので、暗黙の値を繰り返すことは望ましくありません。複雑なSQLiteビューの選択

例えば、1179817(Security.Id = 24)の値のみを読むEXECUTEFILEListDirectoryを除く、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; 
+2

: は、次に別の値のサブセットである同じエントリの値をフィルタリングすることの周りに別のクエリを包みます(すべての側面を示す)と望ましい出力を示します。 SQLIteの場合、MCVEにはSQLiteデータベースの '.dump'が含まれています。 何が似ているかを指摘してください。 – Yunnosch

答えて

0

クエリの名前の実際の値を追加します。 MCVEのstackoverflow.com/help/mcve アンMCVEはサンプル入力の様々なを含める必要がありますしてください

WITH AllValues(SecurityId, Name, Value) AS (
    SELECT s.Id, 
      f.Name, 
      f.Value 
    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 
) 
SELECT SecurityId, 
     Name 
    FROM AllValues 
WHERE NOT EXISTS (SELECT * 
        FROM AllValues AS AV2 
        WHERE AV2.SecurityId = AllValues.SecurityId 
         AND (AV2.Value & AllValues.Value) != 0 
         AND AV2.Value > AllValues.Value 
       ) 
ORDER BY 1, 2; 
+0

Brilliant、私は、値の列に似たような値を持つFileSystemRightsのエントリを含めないように調整しようとしています。たとえば、上の例では、SecurityID 25のAppendDataとCreateDirectoriesと、SecurityId 26のCreateFilesとWriteDataの両方が生成されています。最初のクエリから「GROUP BY SecurityId、Value ORDER BY SecurityId、FileSystemRightsId'しかしパフォーマンスは深刻ですか? – Ritmo2k

関連する問題