2010-01-08 33 views
5

Có cách nào để truy vấn cơ sở dữ liệu TFS để có được cuối cùng 10 check-in chi tiếtcơ sở dữ liệu Query TFS để lấy cuối cùng 10 chi tiết check-in

Đầu ra phải được cái gì đó như

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

Tôi lưu ý rằng tập kết quả ở trên có thể thu được bằng cách sử dụng SDK TFS. Nhưng tôi muốn biết nếu có một cách để truy vấn cơ sở dữ liệu TFS để tìm nạp dữ liệu trên.

Cảm ơn

+0

Làm thế nào về điều này. Lấy bộ kết quả thông qua TFS SDK trong khi bạn có Profiler chạy trên máy chủ TFS. Xem những câu lệnh SQL được tạo ra. –

Trả lời

1

Cách giải quyết như thế nào về truy vấn bên dưới .. Nhưng tôi nghĩ rằng nó trả lại cho tôi nhận xét sai .. không chắc chắn tại sao.

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 

Nhờ mark.crockett cho đăng các truy vấn trên @http://social.msdn.microsoft.com/Forums/en-US/tfsreporting/thread/32d2c27e-825b-43bb-b156-36048a3e70cb/

8

Nếu tôi hiểu câu hỏi của bạn một cách chính xác, điều này sẽ giúp bạn có được hầu hết các cách có trong 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 

Có một số trốn thoát ký tự trong tên tập tin đó xuất hiện khi tôi đang thử nghiệm điều này trên cá thể TFS của tôi (như ký tự gạch dưới trở thành ">"). Khác hơn rằng điều này sẽ phục vụ bạn tốt.

+0

cảm ơn saul. điều này làm việc cho tôi. Bạn có thể pls. cho tôi biết nếu các điều trên cần phải được sửa đổi để đưa ra kết quả cho một DỰ ÁN THAM GIA có thể thực hiện được như thế nào? – stackoverflowuser

+0

tôi đoán bạn đã thay đổi truy vấn. Truy vấn mới không đưa ra kết quả mong muốn. – stackoverflowuser

+0

Tôi hoàn nguyên về truy vấn ban đầu. Xin lỗi vì sự nhầm lẫn. Theo như thực hiện công việc này cho một DỰ ÁN THAM GIA Tôi không chắc chắn nếu điều này có thể được thực hiện. TFS Version Control không theo dõi các thay đổi rõ ràng cho một dự án nhóm theo mặc định. Cách duy nhất tôi có thể nghĩ để thực hiện điều này sẽ phụ thuộc vào người dùng kết hợp tất cả các thay đổi của họ với các mục công việc cụ thể trong một dự án nhóm đã cho. –

0

Nếu bạn có quyền truy cập vào máy chủ SQL lưu trữ cơ sở dữ liệu TFS, bạn phải tìm TFSWarehouse, sau đó bạn có thể tìm các mục Work Item, tbl_Changeset, tbl_Identity, tbl_Version, vv .. từ đó bạn có thể lấy một số thông tin.

Thnks.

3

Rất nhiều các truy vấn này không còn phù hợp với trường hợp mới của TFS. Một trong những lý do chính là danh tính người dùng (tbl_Identity) đã được di chuyển. Tfs_DefaultCollection là DB lưu trữ tất cả thông tin liên quan đến một Bộ sưu tập nhất định, nhưng TFS có thể lưu trữ nhiều Bộ sưu tập AND một Quản trị viên có thể thay đổi tên của Bộ sưu tập mặc định khi thiết lập TFS.

Như vậy, tất cả các nhận dạng người dùng đã được chuyển đến cơ sở dữ liệu Tfs_Configuration;

select * from [tfs_Configuration].dbo.tbl_Identity 

Đạt Truy cập vào phần mô tả của tên tài khoản (AccountName hoặc DisplayName) từ một Bộ sưu tập DB được thực hiện bằng Tham gia từ [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 

Với thông tin này trong tay , bây giờ chúng ta có thể tạo ra truy vấn sau đây để hiển thị 100 ChangeSets cuối cùng đã cam kết với TFS cũng như tên của người commit.

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 

Nhìn vào dữ liệu này, chúng ta có thể nhìn thấy rất nhiều ID, SIDS, tra cứu vv Những gì chúng ta sẽ không thấy trong dữ liệu này là bất kỳ thông tin về các tập tin đã được cam kết hoặc thông tin về chi nhánh Commit đã được thực hiện. Thông tin này đến từ bảng 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 có một vài cột quan tâm, cụ thể là; ParentPath, ChildItem & FullPath.Điều còn thiếu ở đây là bất kỳ thông tin hữu ích nào liên quan đến Chi nhánh mà cam kết đã được đưa ra. Thông tin chi nhánh được nhúng vào một trong hai trường Đường dẫn có sẵn;

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

Điều này đặt ra câu hỏi tiếp theo, thông tin chi tiết được lưu trữ trong TFS ở đâu? Nhờ câu trả lời StackOverflowUsers ở trên, thông tin này được tìm thấy trong bảng [tfs_DefaultCollection] .dbo.TreeNodes;

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

Các CssNodeID Cột là ID chúng tôi đang tìm kiếm để làm cho tinh thần ra khỏi fullpath

CoolBranchName da3da7cf-80b5-4385-b3dc-ebb3088f3c01 

Tuy nhiên, điều này cho chúng ta với thử thách tiếp theo của chúng tôi liên quan đến việc cơ sở dữ liệu TFS. Rất nhiều thông tin được mã hóa và \ hoặc được nhúng nên chúng ta cần thao tác một vài thứ để có được những gì chúng ta đang có.

Trong trường hợp này, một phần của giá trị [tfs_DefaultCollection] .dbo.tbl_Version.ParentPath hoặc [tfs_DefaultCollection] .dbo.tbl_Version.FullPath chứa thông tin Chi nhánh.

này ít Diddy xấu xí ngay tại đây trích xuất phần ID của giá trị trường ParentPath và thay thế tất cả các dấu nháy kép với dấu gạch ngang đó cho chúng ta một giá trị Id chúng ta có thể sử dụng để truy vấn [Tfs_DefaultCollection] .dbo.TreeNodes

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

Đưa tất cả điều này lại với nhau để theo đuổi truy vấn tìm nạp chi tiết đăng ký cuối cùng [X] kết quả như sau;

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 

Lưu ý rằng tôi đã bao gồm các vòng loại DB cho tất cả các truy vấn dẫn đến truy vấn cuối cùng để cung cấp ngữ cảnh nơi đặt bảng quan tâm.

Các vấn đề liên quan