Запросите базу данных TFS, чтобы получить последние 10 деталей регистрации - PullRequest
6 голосов
/ 08 января 2010

Есть ли способ запросить базу данных TFS, чтобы получить последние 10 деталей регистрации

На выходе должно быть что-то вроде

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

Мне известно, что вышеуказанный набор результатов можно получить с помощью TFS SDK. Но я хочу знать, если есть способ запросить базу данных TFS для получения вышеуказанных данных.

Спасибо

Ответы [ 4 ]

8 голосов
/ 08 января 2010

Если я правильно понимаю ваш вопрос, это поможет вам в 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 (например, символы подчеркивания становятся ">"). Кроме того, это должно послужить вам хорошо.

5 голосов
/ 08 января 2017

Многие из этих запросов больше не соответствуют новым экземплярам TFS. Одна из главных причин заключается в том, что идентификационные данные пользователя (tbl_Identity) были перемещены. Tfs_DefaultCollection - это БД, в которой хранится вся информация, относящаяся к данной Коллекции, но TFS может содержать несколько Коллекций И . Администратор может изменить имя Коллекции по умолчанию при настройке TFS.

Таким образом, все пользовательские удостоверения были перемещены в базу данных Tfs_Configuration;

select * from [tfs_Configuration].dbo.tbl_Identity

Получение доступа к описательной части имени учетной записи (AccountName или DisplayName) из DB коллекции осуществляется путем объединения из [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

Имея эту информацию в руках, мы можем теперь создать следующий запрос, чтобы показать последние 100 ChangeSets, зафиксированных в TFS, а также имя коммиттера.

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

Глядя на эти данные, мы можем увидеть МНОЖЕСТВО идентификаторов, Sids, поисков и т. Д. В этих данных мы НЕ увидим какую-либо информацию о файле, который был зафиксирован, или информацию о филиале, для которого был сделан коммит. Эта информация взята из таблицы 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 & FullPath. Чего здесь не хватает, так это какой-либо полезной информации о Отделении, в которое было внесено обязательство. Информация о ветвях встроена в любое из 2 доступных полей Path;

$\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

CoolBranchName  da3da7cf-80b5-4385-b3dc-ebb3088f3c01

Однако это ставит перед нами следующую задачу, касающуюся баз данных TFS. Много информации закодировано и \ или внедрено, поэтому нам нужно манипулировать несколькими вещами, чтобы получить то, что нам нужно.

В этом случае, часть значения [tfs_DefaultCollection] .dbo.tbl_Version.ParentPath или [tfs_DefaultCollection] .dbo.tbl_Version.FullPath, содержащая информацию о ветви.

Этот уродливый маленький дидди прямо здесь извлекает часть ID значения поля ParentPath и заменяет все двойные кавычки дефисами, что дает нам значение 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

Обратите внимание, что я включил квалификаторы БД для всех запросов, ведущих к окончательному запросу, чтобы предоставить контекст, в котором расположены таблицы интереса.

1 голос
/ 08 января 2010

Как обходной путь, как насчет запроса ниже ... Но я думаю, что он возвращает мне неправильные комментарии .. не знаю, почему.

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/

0 голосов
/ 08 января 2010

Если у вас есть доступ к SQL-серверу, на котором размещена база данных TFS, вам нужно просмотреть базу данных TFSWarehouse, тогда вы можете искать таблицы Work Item, tbl_Changeset, tbl_Identity, tbl_Version и т. Д., Откуда вы можете получить некоторую информацию.

Thnks.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...