很多这些查询不再与较新的TFS实例相关。其中一个重要原因是用户身份(tbl_Identity)已被移动。 Tfs_DefaultCollection是存储与给定Collection相关的所有信息的DB,但TFS可以托管多个集合,管理员可以在设置TFS时更改默认Collection的名称。
因此,所有用户身份都已移至Tfs_Configuration数据库;
select * from [tfs_Configuration].dbo.tbl_Identity通过从[tfs_DefaultCollection] .dbo.tbl_IdentityMap加入来获取从集合数据库访问帐户名称(AccountName或DisplayName)的描述性部分的权限。
select *
from [tfs_Configuration].dbo.tbl_Identity I
JOIN [tfs_DefaultCollection].dbo.tbl_IdentityMap IM
ON I.Id = IM.MasterID有了这些信息,我们现在可以生成以下查询,以显示提交给TFS的最后100个ChangeSet以及提交者的名称。
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查看这些数据,我们可以看到很多ID,Sids,Lookup等。我们在此数据中看不到的是有关已提交的文件或有关提交分支的信息的任何信息。此信息来自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有几个感兴趣的列,即; ParentPath,ChildItem&完整路径。这里缺少的是有关提交提交的分支的任何有用信息。分支信息嵌入在2个可用路径字段中的任何一个中;
$\da3da7cf"80b5"4385"b3dc"ebb3088f3c01\Features\Inpatient\Source\Yadda\Yadda\Yadda\这引出了下一个问题,分支信息存储在TFS中?感谢上面的StackOverflowUsers答案,此信息可在[tfs_DefaultCollection] .dbo.TreeNodes表中找到;
select * from [tfs_DefaultCollection].dbo.[TreeNodes] where parentID=0 and fDeleted=0Column CssNodeID是我们想要从FullPath中理解的ID
CoolBranchName da3da7cf-80b5-4385-b3dc-ebb3088f3c01但是,这为我们提供了有关TFS数据库的下一个挑战。很多信息都是编码和/或嵌入的,所以我们需要操作一些东西才能得到我们所追求的东西。
在此实例中,包含分支信息的[tfs_DefaultCollection] .dbo.tbl_Version.ParentPath或[tfs_DefaultCollection] .dbo.tbl_Version.FullPath值的一部分。
这个丑陋的小伙伴就在这里提取ParentPath字段值的ID部分并用连字符替换所有双引号,它给我们一个Id值,我们可以用来查询[Tfs_DefaultCollection] .dbo.TreeNodes
SUBSTRING(
REPLACE( v.ParentPath, '$\', ''),
CHARINDEX( '\', REPLACE( v.ParentPath, '$\', '') ),
( LEN( v.ParentPath ) - CHARINDEX( '\', REPLACE( v.ParentPath, '$\', '') ) )
)将所有这些放在一起以寻求查询以获取最后[X]签入详细信息的结果如下;
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请注意,我为所有查询包含了DB限定符,以便提供最终查询以提供感兴趣的表所在位置的上下文。