Ich habe zwei Tabellen, TableA
und TableB
. TableB
hat eine FK
zu TableA
. Dies ist eine SQL Server 2012-Datenbank mit Primärschlüsseln in beiden Tabellen mit der Bezeichnung Id.
. Es sind noch keine anderen Indizes vorhanden.TSQL-Abfrage Von SQL Server 2012-Datenbank, zwei verschiedene Tabellen, ein Elternteil, ein Kind
Die erste Tabelle als TableA
hält, den Zugriff auf einen Ordner mit den folgenden Spalten:
Id
(RowId, Primärschlüssel)Path
(vollständiger Pfad des Ordner/Verzeichnisses, nvarchar (255) )
GroupName
(Active Directory-Gruppe, nvarchar (255))Guid
(Guid der Gruppe, nvarchar (128))
Die zweite Tabelle als TableB
hält Berechtigungen für diesen Ordner oder Verzeichnis:
Id
(RowId, Primary Key)TableARowId
(FK, RowId von TableA)Permission
(nvarchar (128) , 12 verschiedene mögliche Werte)
Was ich gefragt habe zu tun ist, Path
abzufragen, GroupName
, Guid
und Permissions
für alle Ordner. Keine große Sache.
Das Problem ist, wenn die Gruppen und Berechtigungen von einem bestimmten Ordner in dem Pfad (Beispiel: \\FolderA\FolderB\FolderC\
) ist das gleiche der ganzen Weg hinunter auf den niedrigsten Stand (\\FolderA\FolderB\FolderC\
.... \Folder[N]
), sie wollen nur sehen, nach oben in den ersten Ordner mit den gleichen Gruppen und Berechtigungen. Wenn also FolderB
andere Gruppen und Berechtigungen als FolderA
hat, dann sind alle benötigten Felder im Datensatz für diesen Pfad enthalten. Wenn FolderC
über andere Gruppen und Berechtigungen als FolderB
verfügt, befinden sich alle erforderlichen Felder im Dataset für diesen Pfad.
Aber wenn FolderC
die gleiche Anzahl von Gruppen hat und Berechtigungen den ganzen Weg hinunter zu FolderW
, dann der letzte Ordner in dem Datensatz für diesen Pfad FolderC
sein wird. Das ist der Teil, den ich nicht verstehen kann.
Ich vermutete, die Antwort sollte eine rekursive CTE mit dem Anker als Root-Verzeichnis enthalten. Aber ich dachte, die Rekursion sollte die Gruppen und Berechtigungen des letzten Ordners mit dem vorherigen Datensatz vergleichen, und wenn es anders ist, füge es dem Datensatz hinzu, andernfalls überspringe es.
Aber es gibt etwas, das ich nicht durchmachen konnte, während ich versuchte, meine erste Frage zu beantworten. Wie codierst du das Szenario von FolderA - FolderC ist anders, dann ist FolderC zu FolderP identisch, und FolderP zu FolderZ sind anders? In diesem Fall möchte ich trotzdem alle Ordner bis zu FolderP anzeigen lassen. Das ist der Teil, der meinen Kopf schmerzt.
Der Code, den ich schrieb, brachte mich nicht sehr weit.Ich schrieb:
(SELECT
[Path]
,[GroupName]
,[Guid]
,PermissionAsOneRow
FROM [TableA] TA INNER JOIN
( SELECT [TableARowId], PermissionAsOneRow FROM (
SELECT [Id], TBL1.[TableARowId],
(SELECT [Permission] + ', '
FROM [TableB] TBL2
WHERE TBL2.[TableARowId] = TBL1.[TableARowId]
FOR XML PATH('')) AS PermissionAsOneRow
FROM [TableB] TBL1
GROUP BY [Id], TBL1.[TableARowId]) AS MYDATA
GROUP BY [TableARowId], PermissionAsOneRow) AS MD ON TA.Id = MD.[TableARowId])
Das ist mir Daten gibt, die wie folgt aussehen:
Id Path GroupName Guid Permission
-----------------------------------------------------------------------------------------------------------------------
1 \\FolderA\FolderB\ SomeGroupNameA [RandomGuidValueHereA] PermissionA,PermissionB,PermissionC,PermissionD
2 \\FolderA\FolderB\FolderC\ SomeGroupNameB [RandomGuidValueHereB] PermissionA,PermissionB,PermissionC,PermissionD
3 \\FolderA\FolderB\FolderC\...Folder[N] SomeGroupNameC [RandomGuidValueHereC] PermissionA,PermissionB,PermissionC
ich die Daten auf diese Weise organisiert, weil ich dachte, es wäre leicht, rudert auf dem Berechtigungsfeld nach Zeile zu vergleichen, wie ich wie oben beschrieben, unter Verwendung des rekursiven CTE. Aber ehrlich gesagt wusste ich nicht, wie ich den nächsten Schritt machen sollte und fing an zu denken, dass es nicht funktionieren würde.
Alle und alle Hilfe wird geschätzt.
Für diejenigen, die antworten können, bitte erklären, damit ich daraus lernen kann.
unten Siehe zum Beispiel von Daten, bitte meine Formatierung
Beispiel von Daten in TableA
Id Path GroupName Guid
------------------------------------------------------------------------------------
1 \\FolderA\FolderB\ SomeGroupNameA [RandomGuidValueHereA]
2 \\FolderA\FolderB\FolderC\ SomeGroupNameB [RandomGuidValueHereB]
3 \\FolderA\FolderB\FolderC\...Folder[N] SomeGroupNameC [RandomGuidValueHereC]
4 \\FolderAA\FolderBB\FolderCC\ SomeGroupNameD [RandomGuidValueHereD]
5 \\FolderAA\FolderBB\FolderCC\...Folder[N] SomeGroupNameE [RandomGuidValueHereE]
Beispiel von Daten in TableB
Id TableARowId Permission
--------------------------
1 1 PermissionA
2 1 PermissionB
3 1 PermissionC
4 1 PermissionD
5 2 PermissionA
6 2 PermissionB
7 2 PermissionC
Sie können Ihre Beispieldaten mit '{}' Codeblöcken formatieren und sie anders darstellen (wie bei Datenbanken). Ziehen Sie auch in Erwägung, Ihren Ansatz hinzuzufügen - Abfrage, die Sie versucht haben. –
Ich habe die Beispieldaten @ConsiderMe aktualisiert, Danke. –
Sie sollten die Beispieldaten wirklich als ** Tabellen ** formatiert anzeigen - viel einfacher zu lesen und zu verstehen! –