Z dokumentacji technet ( http://msdn.microsoft.com/en-us/library/ms187768%28v=sql.105%29.aspx )
„Associates up to 128 bytes of binary information with the current session or connection. „
Niewiele osób o tym wie, ale SQL Server pozwala na ustawienie jednej zmiennej globalnej (typu binary(128)), dostępnej do odczytu i modyfikacji podczas działania wszystkich operacji wykonywanych w ramach sesji użytkownika.
Innymi słowy możemy zapisać jakąś wartosc, wykorzystać ja w dowolnym kodzie, który będzie wykonywany podczas naszego połączenia do bazy (np w procedurze albo nawet w triggerze czy funkcji), taka zmienna będzie dostępna aż do zakończenia połączenia z bazą danych.
Do czego może nam to się przydac?
– do identyfikacji operacji serwisowych (implementujemy specjalną logikę w naszym kodzie, jesli zmienna kontekstowa zawiera jakis unikalny klucz to możemy wywołać cos niestandardowego)
– oznaczanie charakterystycznych połączeń znacznikami (przykładowo możemy ustawić jako operację administratora: „WDROŻENIE PATCHA”, zawartośc context_info mozna odczytac bez problemu w tabelach sys.sysprocesses, sys.dm_exec_sessions, sys.dm_exec_requests da się zatem wtedy rozpozna, ze dany proces i jego aktualnie wywolywana instrukcja sa elementem wdrozenia jednego patcha)
– do zabawy 🙂 sky is the limit 😛
Przykład:
DECLARE @zakodowany_napis BINARY(128) = CAST('Jestę programistom, co ja paczę?!' AS BINARY(128)) --kodujemy napis w postaci binarnej SELECT [Co zawiera binarnie?] = @zakodowany_napis --sprawdzamy jak wyglada nasz napis w postaci binarnej SET CONTEXT_INFO @zakodowany_napis -- zapisujemy w sesji nasza zmienna. GO--wykonujemy batcha, po tej operacji @zakodowany_napis juz nie istnieje, ale CONTEXT_INFO wciaz trzyma nasza wartosc SELECT [moja zmienna w sys.sysprocesses] = CAST(context_info AS VARCHAR(128)) , * FROM sys.sysprocesses WHERE spid = @@SPID --sprawdzamy jaka wartosc ma proces, z ktorego wykonalismy zapytanie GO SELECT [jaki napis zwraca CONTEXT_INFO()?] = CAST(CONTEXT_INFO() AS VARCHAR(128)) --sposob uzycia funkcji CONTEXT_INFO()
Wynik: