2015年10月8日 星期四

[TFS] 手動更新Work Item在資料庫的欄位值

 ALM   Team Foundation Server  


背景

當升級TFS之後, 如果有客製化的欄位必須更新到新的WIT (Work Item Type)的其他欄位(也有可能是新的客製化欄位)。 這時候手動更新TFS Database是最快的方式。

PS. 當然MSDN是極力強調避免手動更改Database … 不過我想不到更快的方式了。

環境

l   Windows2008 R2
l   Team Foundation Server 2013 Update 5
l   SQL SERVER Management Studio  2012



Steps



重點在於以下幾個表格 (位於 TFS_XXXXCollection 資料庫)

Table Name
描述
[dbo].[Fields]
欄位明細表
[dbo].[WorkItemsAre]
Work Item 的屬性
[dbo].[WorkItemsLatest]
Work Item 的最後屬性



We update the WorkItemsAre table during a save.  At this point the server does a rules evaluation to check whether any of the changes made are valid (for example state transitions).  When this rule check or authorization succeeds, the changes in the WorkItemsAre table are copied to the WorkItemLatest table (which is why they look identical).

亦即在新增/更新Work Item時, TFS會先儲存在WorkItemsAre,驗證正確後,再更新至WorkItemsLatest

所以如果您要手動更改Wotk Item的欄位值,必須將WorkItemsAre & WorkItemsLatest 兩個同時更新。 如果只更新WorkItemsLatest 在介面上的確會看到更新後的值,可是一儲存後,未在介面上更動的值又會被WorkItemsAre裡面的欄位值所覆蓋。


Sample SQL

底下的例子是我在TFS Migration之後,複製舊的工作成新的工作,再使用以下SQL將新工作裡面的新欄位值用舊工作的一些欄位取代。

Begin transaction;

UPDATE a
SET
--Fld10283=b.Fld10041,
--Fld10276=b.Fld10046,
--Fld10274=b.Fld10045,
--Fld10275=b.Fld10044,
--Fld10277=b.Fld10029,
--Fld10279=CASE WHEN b.Fld10031='Yes' THEN 'true'
--              WHEN b.Fld10031='No' THEN 'false'
--            ELSE NULL END,
----Fld10282=b.Fld10032
--Fld10278=b.Fld10030,
--Fld10280=b.Fld10033,
--Fld10281=b.Fld10034,
Fld10289=b.Fld10157,
Fld10288=b.Fld10158,
Fld10287=b.Fld10055
FROM WorkItemsLatest a
INNER JOIN
(
select * from WorkItemsLatest
where ID<35774
AND [Work Item Type]='工作'
) b
ON a.Title=b.Title and a.ID!=b.ID
where a.ID>=35774
AND a.[Work Item Type]='需求'

commit;




是否可以直接調整Work Item所屬的Team專案?

答案是: I don’t know how to do it correctly!
即使依照上面的做法,調整好兩個WI表格的AreaPath,介面上的確會顯示更新後的專案路徑。
可是一存檔的時候,馬上會出現以下錯誤訊息:



這一部分目前是直接手動用介面複製一份新的Work Item 再刪除舊的。

(浪費超多時間 lol )

沒有留言:

張貼留言