SET CONTEXT_INFO

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:

Post pierwotnie opublikowany jako TSQL na dziś #9

Dodaj komentarz