Многие из этих запросов больше не соответствуют новым экземплярам 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
Обратите внимание, что я включил квалификаторы БД для всех запросов, ведущих к окончательному запросу, чтобы предоставить контекст, в котором расположены таблицы интереса.