【问题标题】:Query TFS database to fetch last 10 check-in details查询 TFS 数据库以获取最近 10 次签到详细信息
【发布时间】:2011-01-03 00:21:58
【问题描述】:

有没有办法查询 TFS 数据库以获取最近 10 次签到详细信息

输出应该是这样的

File name    |      Comment              |   Changed By     |     Date
----------------------------------------------------------------------------
Test.cs         Added new functionality       username           01/08/2010

我知道上述结果集可以使用 TFS SDK 获得。但我想知道如果 有一种方法可以查询 TFS 数据库以获取上述数据。

谢谢

【问题讨论】:

  • 这个怎么样。在 TFS 服务器上运行 Profiler 时,通过 TFS SDK 获取结果集。查看生成了哪些 SQL 语句。

标签: sql sql-server tfs


【解决方案1】:

如果我正确理解了您的问题,这将使您在 SQL 中获得大部分内容:

SELECT TOP 10
V.ChildItem AS [File name],
CS.Comment,
I.DisplayName AS [Changed By],
CS.CreationDate AS [Date]
FROM tbl_Changeset CS
INNER JOIN tbl_Identity I ON I.IdentityID = CS.OwnerID
INNER JOIN tbl_Version V ON V.VersionFrom = CS.ChangesetID
ORDER BY CS.CreationDate DESC

当我在我的 TFS 实例上进行测试时,文件名中出现了一些转义字符(比如下划线字符变为“>”)。除此之外,这应该很好地为您服务。

【讨论】:

  • 谢谢扫罗。这对我有用。你能请。让我知道是否需要修改上述内容以提供特定项目的结果,如何做到这一点?
  • 我猜你更改了查询。新查询未给出预期结果。
  • 我恢复到原来的查询。对困惑感到抱歉。至于为特定项目做这项工作,我不确定这是否可以做到。默认情况下,TFS 版本控制不会明确跟踪团队项目的变更集。我能想到的唯一方法是让用户将他们的所有变更集与给定团队项目下的特定工作项相关联。
  • 作为一种解决方法如何处理此查询... SELECT top 10 C.ChangeSetId, V.FullPath, V.ParentPath, REPLACE(V.ChildItem,'\','') as [FileName] , C.CreationDate, I.DisplayName, C.Comment FROM tbl_Version(nolock) V INNER JOIN tbl_File (nolock) F ON V.ItemId = F.ItemId INNER JOIN tbl_Changeset (nolock) C ON V.VersionTo = C.ChangeSetId INNER JOIN tbl_Identity (nolock) I ON C.CommitterId = I.IdentityId where v.ParentPath like '$\' + (select name from [TfsWorkItemTracking].[dbo].[treenodes] where parentid=0 and fdeleted=0 and id=524 ) + '\%' order by C.CreationDate desc
  • 检查 Version.ParentPath 的值来确定项目。然后,该项目只是顶级“文件夹”。
【解决方案2】:

其中许多查询不再与较新的 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 限定符,以提供有关表所在位置的上下文。

【讨论】:

  • 老实说,现在唯一值得在此线程上查看的答案。
【解决方案3】:

作为一种解决方法,下面的查询怎么样..但我认为它返回了错误的 cmets..不知道为什么。

SELECT top 10
C.ChangeSetId, 
V.FullPath, 
V.ParentPath, 
REPLACE(V.ChildItem,'\','') as [FileName], 
C.CreationDate, 
I.DisplayName,
C.Comment
FROM tbl_Version(nolock) V
INNER JOIN tbl_File (nolock) F ON V.ItemId = F.ItemId
INNER JOIN tbl_Changeset (nolock) C ON V.VersionTo = C.ChangeSetId
INNER JOIN tbl_Identity (nolock) I ON C.CommitterId = I.IdentityId
where v.ParentPath like '$\' + (select name from [TfsWorkItemTracking].[dbo].[treenodes] where parentid=0 and fdeleted=0 and id=524) + '\%'
order by C.CreationDate desc

感谢 mark.crockett 发布上述查询 @http://social.msdn.microsoft.com/Forums/en-US/tfsreporting/thread/32d2c27e-825b-43bb-b156-36048a3e70cb/

【讨论】:

    【解决方案4】:

    如果您有权访问托管 TFS 数据库的 SQL 服务器,您必须查看的数据库是 TFSWarehouse,那么您可以查找表 Work Item、tbl_Changeset、tbl_Identity、tbl_Version 等,从中可以提取一些信息。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2020-08-24
      • 2012-06-22
      相关资源
      最近更新 更多