Błąd TF246021 […] SQL Server Error: 50000 w Team Foundation Server
Ponieważ to był cięższy przypadek niż na początku myślałem, robię ten zapisek na przyszłość dla samego siebie. Ale może komuś też się przyda kiedyś. Szukając w Google rozwiązania, nie znalazłem podobnego przypadku.
Zaczęło się niewinnie. Koledze zrobili nowe konto w AD. Ale z tym samym loginem, z tymi samymi danymi. Poprzednie konto zmieniło nazwę. Zmienił się oczywiście SID. Kolega utracił dostępy w wielu miejscach, również w TFS. W zasadzie normalka – wywaliłem go z grup, dodałem ponownie, odzyskał dostęp – widział wszystkie zakamarki które miał widzieć.
Niestety, próbując dodać cokolwiek do TFS (nowy Bug czy PBI) dostawał niezmiennie komunikat:
TF246021: An error occurred while processing your request. Technical information (for administrator): SQL Server Error: 50000
Dodatkowo, kiedy próbowałem go wskazać jako właściciela jakiegoś elementu w TFS (np. Zadania), dostawałem:
The field 'Changed By’ contains the value 'Imię Nazwisko’ that is not in the list of supported values
Najlepsze jest to, że uprawnienia działały normalnie – kolega mógł otwierać te obszary TFS, do których miał dostęp.
Finalnie skończyło się na 2h szukania po tabelkach bazy danych i w końcu za pomocą SQL Server Profilera dotarłem w to niepozorne miejsce:
Po zajrzeniu w ciału tej procedury i wykonaniu kilku testów na „dobrym” i „złym” użytkowniku problem okazał się prosty – błędny SID i UID użytkownika TFS w tabeli [dbo].[Constants]. Można to sprawdzić znając UID użytkownika TFS (ten poprawny, z tabeli [dbo].[ADObjects]) i wykonując procedurę [dbo].[GetConstantRecords]. Albo w dowolny inny sposób (np. porównując wartości kolumn przechowujących SID i TeamFoundationId w obu w/w tabelach.
Ręczna poprawka SID i TeamFoundationId w tabeli [dbo].[Constants] powinna rozwiązać problem.
Przykładowe odpalenie procedury GetConstantRecords niżej:
declare @p2 dbo.typ_WitOrderedStringTable
insert into @p2 values(N'tutaj podajemy tfs id',0)
DECLARE @return_value int
EXEC @return_value = [dbo].[GetConstantRecords]
@partitionId = 1,
@values = @p2,
@searchFactor = 4,
@returnInactiveIdentities = 0
SELECT 'Return Value' = @return_value
GO