2010-01-08 31 views
5

¿Hay una forma de consultar la base de datos de TFS para conseguir la última 10 check-in detallesbase de datos de consulta de TFS para ir a buscar últimos 10 datos de facturación

La salida debe ser algo como

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

soy consciente de que el conjunto de resultados anterior se puede obtener utilizando TFS SDK. Pero quiero saber si hay una manera de consultar la base de datos TFS para recuperar los datos anteriores.

Gracias

+0

Qué tal esto. Obtenga el conjunto de resultados a través del TFS SDK mientras tiene el Analizador ejecutándose en el servidor TFS. Vea qué declaraciones SQL se generan. –

Respuesta

1

Como solución, ¿qué le parece la siguiente consulta ... Pero creo que me está devolviendo los comentarios incorrectos ... no estoy seguro de por qué.

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 

Gracias a mark.crockett por publicar la consulta anterior @http://social.msdn.microsoft.com/Forums/en-US/tfsreporting/thread/32d2c27e-825b-43bb-b156-36048a3e70cb/

8

Si entiendo bien su pregunta, esto le ayudará a la mayor parte del camino en 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 

Hay algunos escaparon caracteres en los nombres de los archivos que se presentaron mientras estaba probando esto en mi instancia de TFS (como los caracteres de subrayado se convierten en ">"). Aparte de eso, esto debería servirte bien.

+0

gracias saul. esto funciona para mi Puedes por favor avíseme si lo anterior necesita ser modificado para dar los resultados de un PROYECTO EN PARTICULAR ¿cómo se puede hacer eso? – stackoverflowuser

+0

supongo que cambiaste la consulta. La nueva consulta no da los resultados previstos. – stackoverflowuser

+0

Volví a la consulta original. Perdón por la confusion. En cuanto a hacer que esto funcione para un PROYECTO EN PARTICULAR, no estoy seguro si esto puede hacerse. TFS Version Control no rastrea los conjuntos de cambios claramente a un proyecto de equipo de forma predeterminada. La única forma en que puedo pensar para lograr esto dependerá de que los usuarios asocien todos sus conjuntos de cambios a elementos de trabajo específicos en un proyecto de equipo determinado. –

0

Si tiene acceso al servidor SQL que aloja la base de datos TFS, la base de datos que debe buscar es TFSWarehouse, puede buscar las tablas Objeto de trabajo, tbl_Changeset, tbl_Identity, tbl_Version, etc., desde donde puede obtener cierta información.

Thnks.

3

Muchas de estas consultas ya no son relevantes con los nuevos casos de TFS. Una de las principales razones es que las identidades de usuario (tbl_Identity) se han movido. Tfs_DefaultCollection es la base de datos que almacena toda la información pertinente para una colección determinada, pero TFS puede alojar varias colecciones Y y un administrador puede cambiar el nombre de la colección predeterminada cuando configura TFS.

Como tal, todas las identidades de usuario se han movido a la base de datos Tfs_Configuration;

select * from [tfs_Configuration].dbo.tbl_Identity 

Obtención de acceso a la parte descriptiva del nombre de cuenta (o AccountName DisplayName) a partir de una colección de DB se logra mediante Únete a partir de [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 

Con esta información en mano , ahora podemos producir la siguiente consulta para mostrar los últimos 100 conjuntos de cambios comprometidos con TFS, así como el nombre del confirmador.

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 

En cuanto a este dato, podemos ver una gran cantidad de ID, el SMSL, búsquedas, etc. Lo que no vamos a ver en estos datos es cualquier información sobre el archivo que se ha cometido o información sobre la Unidad de la Encomienda fue hecho para. Esta información proviene de la tabla 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 tiene algunas columnas de interés, a saber; ParentPath, ChildItem & FullPath.Lo que falta aquí es información útil sobre la sucursal a la que se realizó la confirmación. La información de la sucursal está incrustada en cualquiera de los 2 campos de ruta de acceso disponibles;

$\da3da7cf"80b5"4385"b3dc"ebb3088f3c01\Features\Inpatient\Source\Yadda\Yadda\Yadda\ 

Esto lleva a la siguiente pregunta, ¿dónde se almacena la información de la sucursal en TFS? Gracias a la respuesta StackOverflowUsers anterior, esta información se encontró en la tabla [tfs_DefaultCollection] .dbo.TreeNodes;

select * from [tfs_DefaultCollection].dbo.[TreeNodes] where parentID=0 and fDeleted=0 

El CssNodeID columna es el identificador que estamos buscando que tengan sentido fuera de la FullPath

CoolBranchName da3da7cf-80b5-4385-b3dc-ebb3088f3c01 

Sin embargo, esto nos presenta nuestro próximo desafío con respecto a las bases de datos de TFS. Mucha información está codificada y/o integrada, por lo que debemos manipular algunas cosas para obtener lo que buscamos.

En este caso, la parte del valor [tfs_DefaultCollection] .dbo.tbl_Version.ParentPath o [tfs_DefaultCollection] .dbo.tbl_Version.FullPath que contiene la información de la sucursal.

Este pequeño Diddy fea aquí extrae la parte del ID del valor del campo ParentPath y reemplaza todas las comillas dobles con guiones que nos da un valor de ID que podemos utilizar para consultar [Tfs_DefaultCollection] .dbo.TreeNodes

SUBSTRING(
    REPLACE(v.ParentPath, '$\', ''), 
    CHARINDEX('\', REPLACE(v.ParentPath, '$\', '')), 
    (LEN(v.ParentPath) - CHARINDEX('\', REPLACE(v.ParentPath, '$\', ''))) 
) 

Reuniendo todo esto en busca de una consulta para recuperar Los detalles del último [X] check-in dan como resultado lo siguiente;

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 

Nota que incluí la fase de clasificación de base de datos para todas las consultas previas a la consulta final para proporcionar un contexto en donde se encuentran las tablas de interés.

Cuestiones relacionadas