使用CTE查找孤立文件夹

时间:2015-02-06 17:31:36

标签: sql-server common-table-expression

我正在尝试创建一个SQL语法来在我的数据库中搜索用户无法访问的网络上的文件夹。

让我解释一下:

我的数据库有5个表:

表:文件夹

  • FUID - INT - 唯一ID
  • 路径 - Varchar - 示例:E:\ shared
  • 状态 - INT - 1 =好,0 =陈旧

表:组

  • GRUID - INT - 唯一ID
  • 类 - varchar - 用户或管理员组(管理员组是系统管理员组)
  • 名称 - 示例HR_Users
  • 状态 - INT - 1 =好,0 =陈旧

表:用户:

  • URUID - INT - 唯一ID
  • Class - varchar - 标准用户或管理员用户(admin用户是系统管理员)
  • 名称 - Varchar - 示例:Smith,John
  • 状态 - INT - 1 =好,0 =陈旧

表:UG_JOIN:

  • UID:唯一ID
  • GRUID - INT - 与群组的关系
  • URUID - INT - 与用户的关系
  • 状态 - INT - 1 =好,0 =陈旧

表:ACLS:

  • UID - INT - 唯一ID
  • FUID - INT - 与文件夹的关系FUID
  • GRUID - INT - 与组GRUID的关系
  • URUID - INT - 与用户URUID的关系
  • ACCESS - VARCHAR - 访问,列表,读取,修改,完全控制的类型
  • 状态 - INT - 1 =好,0 =陈旧

我必须在ACL表中同时拥有用户和组的原因是因为某些用户直接在该文件夹中分配了权限,而不是按组分配。

无论如何,我想知道的是:

  • 哪些文件夹对标准用户没有任何权限
  • 包括上述内容,我希望能够通过ACCESS过滤掉,因此搜索标准用户不具有修改权限的文件夹。
  • 还想使用STATUS Column过滤掉过时的组,用户,UG_Join,文件夹和acls

我不想找到某些用户可以访问的内容。我不在乎,我想要的是标准用户无法访问的文件夹(列表,读取,修改,完全控制)。我不希望在我的结果中看到用户名或组名,只是路径。

逻辑上,我能想到的就是获取管理员可以访问的所有路径(这是100%的路径),然后跳过最终用户有权访问的路径,只留下只有管理员可以访问的路径。我怎么会这样想?谢谢!

2 个答案:

答案 0 :(得分:0)

请尝试以下查询。它获取所有文件夹,然后使用所有标准用户和该用户的任何标准组,然后应用于过滤器,仅显示没有标准用户或分配的标准组中的标准用户的文件夹。

SELECT DISTINCT
    F.Path
FROM Folders F
    INNER JOIN ACLS A
        ON A.FUID = F.FUID
    LEFT OUTER JOIN (
        SELECT
            U.URUID,
            G.GRUID
        FROM Users U
            LEFT OUTER JOIN UG_JOIN UG
                ON UG.URUID = U.URUID
            LEFT OUTER JOIN Groups G
                ON G.GRUID = UG.GRUID
                    AND G.Class = 'User' -- Whatever class needs to be user group
        WHERE U.Class = 'Standard User' -- Whatever class neeed to be standard group
            -- AND U.STATUS = 1 -- If you only care about active users
    ) UG
    ON (A.URUID = UG.URUID OR A.GRUID = UG.URUID)
WHERE UG.URUID IS NULL

答案 1 :(得分:0)

不确定如何结合第一个和第二个要求,所以我在下面使用Or运算符,让我知道如果我误解了你:)

DECLARE @Class NVARCHAR(100) = 'STANDARD USER'
DECLARE @Access NVARCHAR(100) = 'Modify'



SELECT F.[PATH]
    FROM Folders F
    INNER JOIN ACLS A
        ON A.FUID = F.FUID
    INNER JOIN Users U
        ON U.URUID = A.URUID
    INNER JOIN Groups G
        ON G.GRUID = A.GRUID
    INNER JOIN UG_JOIN UG
        ON UG.URUID = U.URUID
    INNER JOIN UG_JOIN UG2
        ON UG2.GRUID = G.GRUID      
    WHERE (U.Class != @Class --First requirement : What Folders dont have any permission for standard user
                           -- means i will filter out standuser
     OR (A.Access Not LIKE '%' + @Access + '%' 
        AND U.Class = @Class)-- second requirement: search for folders where standard users dont have modify access
     )
    AND F.Status != 0 --Third reqirement : also want to filter out stale group for all the table
    AND A.Status != 0
    AND U.Status != 0
    AND G.Status != 0
    AND UG.Status != 0
    AND UG2.Status != 0