Viele dieser Anfragen nicht mehr relevant sind mit neueren Fällen von TFS mark.crockett. Einer der Hauptgründe ist, dass die Benutzeridentitäten (tbl_Identity) verschoben wurden. Tfs_DefaultCollection ist die Datenbank, in der alle für eine bestimmte Sammlung relevanten Informationen gespeichert wurden. TFS kann jedoch mehrere Sammlungen hosten AND Ein Administrator kann den Namen der Standardkollektion ändern, wenn er TFS einrichtet.
Als solche wurden alle Benutzeridentitäten in die Tfs_Configuration-Datenbank verschoben;
select * from [tfs_Configuration].dbo.tbl_Identity
zu beschreibenden Teil des Kontonamen (Kontoname oder Display) von einer Sammlung DB Zugang erlangen wird durch Join erreicht von [tfs_DefaultCollection] .dbo.tbl_IdentityMap
select *
from [tfs_Configuration].dbo.tbl_Identity I
JOIN [tfs_DefaultCollection].dbo.tbl_IdentityMap IM
ON I.Id = IM.MasterID
Mit diesen Informationen in der Hand , können wir jetzt die folgende Abfrage erzeugen, um die letzten 100 ChangeSets, die an TFS übergeben wurden, sowie den Namen des Commiters anzuzeigen.
select top 100 *
from tbl_changeset as c
JOIN tbl_IdentityMap IM
ON C.OwnerID = IM.localId
JOIN tfs_configuration.dbo.tbl_Identity u
ON IM.MasterID = u.Id
Order by C.ChangeSetID DESC
an diesen Daten Sehen, wir eine Menge von IDs sehen können, Sids, Lookups, etc. Was wir NICHT in diesen Daten zu sehen ist, dass Informationen über die Datei, die über die Niederlassung begangen oder Informationen wurde die Commit wurde gemacht. Diese Informationen stammen aus der Tabelle tbl_Version.
select top 100 *
from [tfs_DefaultCollection].dbo.tbl_changeset as c
JOIN [tfs_DefaultCollection].dbo.tbl_IdentityMap IM
ON C.OwnerID = IM.localId
JOIN [tfs_configuration].dbo.tbl_Identity u
ON IM.MasterID = u.Id
JOIN [tfs_DefaultCollection].dbo.tbl_Version as v
ON v.Versionfrom = c.ChangeSetId
Order by C.ChangeSetID DESC
[tfs_DefaultCollection] .dbo.tbl_Version hat ein paar Spalten von Interesse, nämlich; ParentPath, ChildItem & FullPath.Was hier fehlt, sind nützliche Informationen über den Zweig, an dem das Commit durchgeführt wurde. Zweiginformationen sind in einem der beiden verfügbaren Pfadfelder eingebettet.
$\da3da7cf"80b5"4385"b3dc"ebb3088f3c01\Features\Inpatient\Source\Yadda\Yadda\Yadda\
Dies wirft die nächste Frage auf, wo Branch Info in TFS gespeichert ist? Dank der obigen Antwort StackOverflowUsers wurde diese Information in der Tabelle [tfs_DefaultCollection] .dbo.TreeNodes gefunden;
select * from [tfs_DefaultCollection].dbo.[TreeNodes] where parentID=0 and fDeleted=0
Die Spalte CssNodeID ist die ID wir suchen Sinn aus dem FullPath
CoolBranchName da3da7cf-80b5-4385-b3dc-ebb3088f3c01
jedoch zu machen, dies stellt uns unsere nächste Herausforderung in Bezug auf die TFS-Datenbanken. Viele Informationen sind kodiert und/oder eingebettet, so dass wir ein paar Dinge manipulieren müssen, um zu bekommen, wonach wir suchen.
In diesem Fall der Teil des Werts [tfs_DefaultCollection] .dbo.tbl_Version.ParentPath oder [tfs_DefaultCollection] .dbo.tbl_Version.FullPath, der die Verzweigungsinformationen enthält.
Das hässliche kleine diddy hier extrahiert die ID-Teil des Wertes ParentPath Feld und ersetzt alle doppelten Anführungszeichen mit Bindestrichen, die uns einen ID-Wert gibt wir [Tfs_DefaultCollection] .dbo.TreeNodes
SUBSTRING(
REPLACE(v.ParentPath, '$\', ''),
CHARINDEX('\', REPLACE(v.ParentPath, '$\', '')),
(LEN(v.ParentPath) - CHARINDEX('\', REPLACE(v.ParentPath, '$\', '')))
)
abfragen können
All dies in Verbindung mit einer abzufragenden Abfrage einfügen Die letzten [X] Check-In-Details ergeben Folgendes:
select top 10
c.CreationDate,
c.Comment,
u.DisplayName as CommittingUser,
TN.Name as BranchName,
SUBSTRING(
REPLACE(v.ParentPath, '$\', ''),
CHARINDEX('\', REPLACE(v.ParentPath, '$\', '')),
(LEN(v.ParentPath) - CHARINDEX('\', REPLACE(v.ParentPath, '$\', '')))
) as ChangedFile
from tbl_changeset as c
JOIN tbl_IdentityMap IM
ON C.OwnerID = IM.localId
JOIN [Tfs_Configuration].dbo.tbl_Identity u
ON IM.MasterID = u.Id
JOIN dbo.tbl_Version as v
ON v.Versionfrom = c.ChangeSetId
LEFT JOIN dbo.TreeNodes TN with(nolock)
ON TN.CssNodeId = REPLACE(
SUBSTRING(
REPLACE(v.ParentPath, '$\', ''),
0,
CHARINDEX('\', REPLACE(v.ParentPath, '$\', ''))
),
'"', '-'
)
AND parentID=0
AND fDeleted=0
Order by c.CreationDate desc
Bitte beachte, dass ich die DB-Qualifikation für alle Abfragen enthalten den endgültige Abfragekontext zu schaffen, führen auf dem Tisch in der Nähe befindet.
Wie wäre es damit. Rufen Sie das Resultset über das TFS SDK ab, während Profiler auf dem TFS-Server ausgeführt wird. Sehen Sie, welche SQL-Anweisungen generiert werden. –