其中许多查询不再与较新的 TFS 实例相关。一大原因是用户身份 (tbl_Identity) 已被移动。 Tfs_DefaultCollection 是存储与给定集合相关的所有信息的数据库,但 TFS 可以托管多个集合并且管理员可以在设置 TFS 时更改默认集合的名称。
因此,所有用户身份都已移至 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 个变更集以及提交者的名称。
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、Sid、查找等。我们不会在这些数据中看到有关已提交文件的任何信息或有关提交所针对的分支的信息。此信息来自 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 有几列感兴趣,即;父路径、子项和完整路径。这里缺少的是有关提交的分支的任何有用信息。分支信息嵌入在 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=0
CssNodeID 列是我们要从 FullPath 中寻找有意义的 ID
CoolBranchName da3da7cf-80b5-4385-b3dc-ebb3088f3c01
然而,这给我们带来了关于 TFS 数据库的下一个挑战。许多信息被编码和\或嵌入,因此我们需要操纵一些东西来获得我们想要的东西。
在这种情况下,[tfs_DefaultCollection].dbo.tbl_Version.ParentPath 或 [tfs_DefaultCollection].dbo.tbl_Version.FullPath 值中包含分支信息的部分。
这里这个丑陋的小家伙提取了 ParentPath 字段值的 ID 部分,并用连字符替换了所有双引号,这为我们提供了一个可以用来查询 [Tfs_DefaultCollection].dbo.TreeNodes 的 Id 值
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 限定符,以提供有关表所在位置的上下文。