Sql server 使用CTE查找孤立文件夹
我正在尝试创建一个SQL语法,以便在我的数据库中搜索用户无法访问的网络文件夹 让我解释一下: 我的数据库有5个表: 表:文件夹Sql server 使用CTE查找孤立文件夹,sql-server,common-table-expression,Sql Server,Common Table Expression,我正在尝试创建一个SQL语法,以便在我的数据库中搜索用户无法访问的网络文件夹 让我解释一下: 我的数据库有5个表: 表:文件夹 FUID-INT-唯一ID Path-Varchar-Example:E:\shared 状态-INT-1=良好,0=过时 表:小组 GRUID-INT-Unique-ID Class-varchar-User或Admin组(Admin组是sysadmin组) 名称-HR\U用户示例 状态-INT-1=良好,0=过时 表:用户: URUID-INT-Uniqu
- FUID-INT-唯一ID
- Path-Varchar-Example:E:\shared
- 状态-INT-1=良好,0=过时
- GRUID-INT-Unique-ID
- Class-varchar-User或Admin组(Admin组是sysadmin组)
- 名称-HR\U用户示例
- 状态-INT-1=良好,0=过时
- URUID-INT-Unique-ID
- 类-varchar-标准用户或管理员用户(管理员用户是系统管理员)
- Name-Varchar-示例:史密斯,约翰
- 状态-INT-1=良好,0=过时
- 唯一ID
- GRUID-INT-与组的关系
- URUID-INT-与用户的关系
- 状态-INT-1=良好,0=过时
- UID-INT-唯一ID
- FUID-INT-与文件夹FUID的关系
- GRUID-INT-与组GRUID的关系
- URUID-INT-与用户URUID的关系
- ACCESS-VARCHAR-访问类型、列表、读取、修改、完全控制
- 状态-INT-1=良好,0=过时
- 哪些文件夹对标准用户没有任何权限
- 包括以上内容,我希望能够通过访问权限进行筛选,因此搜索标准用户没有修改权限的文件夹)李>
- 还希望使用状态列筛选出过时的组、用户、UG_连接、文件夹和ACL
从逻辑上讲,我能想到的就是获取管理员有权访问的所有路径(即100%的路径),然后跳过最终用户有权访问的两条路径,只留下只有管理员有权访问的路径。你知道我会怎么做吗?谢谢 请尝试下面的查询。它获取所有文件夹,然后使用该用户的所有标准用户和任何标准组,然后再应用过滤器,仅显示在指定的标准组中没有标准用户或标准用户的文件夹
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
不知道如何结合第一个和第二个要求,所以我在下面使用Or运算符,让我知道我是否误解了u:)
要求1和2是两个独立的查询。很抱歉造成混淆。如果不返回过时的权限/文件夹/用户/组,此查询可能会正常工作。这是一个很好的开始。非常感谢。很高兴它帮助了你。抱歉搞混了。根据您的问题,我假设您正在通过基于表结构的脚本刷新数据库中的权限。是否要求powershell脚本读取实际ACL并遍历文件夹?否我有一个powershell脚本,用于读取每个文件夹的实际ACL并将原始值放入数据库。该脚本还查询所有用户和组成员的active directory。我已经将其设置为每两周自动刷新一次数据。说到这里,我真的只需要一个SQL查询,它可以告诉我文件共享用户无法访问哪些文件夹(读取/列出)(1),另一个查询可以查看哪些文件夹用户不能修改/写入(2)
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