我正在尝试创建一个SQL语法来在我的数据库中搜索用户无法访问的网络上的文件夹。
让我解释一下:
我的数据库有5个表:
表:文件夹
表:组
表:用户:
表:UG_JOIN:
表:ACLS:
我必须在ACL表中同时拥有用户和组的原因是因为某些用户直接在该文件夹中分配了权限,而不是按组分配。
无论如何,我想知道的是:
我不想找到某些用户可以访问的内容。我不在乎,我想要的是标准用户无法访问的文件夹(列表,读取,修改,完全控制)。我不希望在我的结果中看到用户名或组名,只是路径。
逻辑上,我能想到的就是获取管理员可以访问的所有路径(这是100%的路径),然后跳过最终用户有权访问的路径,只留下只有管理员可以访问的路径。我怎么会这样想?谢谢!
答案 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