Verwenden von Informationen zum Sitzungskontext

Mithilfe von Informationen zum Sitzungskontext können Anwendungen binäre Werte bis zu 128 Byte festlegen, auf die in mehreren Batches, gespeicherten Prozeduren, Triggern oder benutzerdefinierten Funktionen verwiesen werden kann, die für dieselbe Sitzung verwendet werden. Sie können einen Sitzungskontextwert mithilfe der SET CONTEXT_INFO-Anweisung erstellen und ihn dann mit einer der folgenden Methoden abrufen:

  • Mit der CONTEXT_INFO-Funktion.

  • Aus den context_info-Spalten in den dynamischen Verwaltungssichten sys.dm_exec_requests und sys.dm_exec_sessions sowie in der Kompatibilitätssicht sys.sysprocesses.

Informationen zum Sitzungskontext unterscheiden sich von Transact-SQL-Variablen, deren Bereich auf den aktuellen Transact-SQL-Batch, die aktuelle gespeicherte Prozedur, den aktuellen Trigger oder die aktuelle benutzerdefinierte Funktion beschränkt ist. Informationen zum Sitzungskontext können zum Speichern von Informationen verwendet werden, die spezifisch sind für jeden Benutzer oder den aktuellen Status der Anwendung. Diese können dann zum Steuern der Logik in Transact-SQL-Anweisungen verwendet werden.

Die CONTEXT_INFO-Funktion ist die bevorzugte Methode zum Abrufen der Sitzungskontextinformationen für die aktuelle Sitzung. Sie können auch die Sitzungskontextwerte für alle aktuellen Sitzungen und Batches aus den context_info-Spalten in den dynamischen Verwaltungssichten sys.dm_exec_requests oder sys.dm_exec_sessions abrufen. Für das Auswählen aus diesen Sichten sind die SELECT- und VIEW SERVER STATE-Berechtigungen erforderlich. Diese Berechtigungen sind nicht erforderlich, wenn Sie die CONTEXT_INFO-Funktion verwenden.

Die Informationen zum Sitzungskontext werden in erster Linie zum Festlegen eines Werts verwendet, der über mehrere Batches für dieselbe Sitzung beibehalten wird. Das folgende Beispiel zeigt, wie ein Wert festgelegt wird, auf den nach der Ausführung verschiedener Batches verwiesen werden kann.

-- Set context information at start.
SET CONTEXT_INFO 0x125666698456;
GO
-- Perform several nonrelated batches.
EXEC sp_helpfile;
GO
USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE Name LIKE (N'Metal%')
ORDER BY ProductID;
GO
-- Select the context information set several batches earlier.
SELECT CONTEXT_INFO();
GO

Werte der Informationen zum Sitzungskontext

Wenn für die aktuelle Sitzung SET CONTEXT_INFO noch nicht ausgeführt wurde, werden die folgenden Sitzungswerte gemeldet:

  • Die CONTEXT_INFO-Funktion gibt NULL zurück.

  • Die context_info-Spaltenwerte in den Systemsichten werden für die Zeilen, die der aktuellen Sitzung und Anforderung zugeordnet sind, auf Binärnullen im Umfang von 128 Byte festgelegt.

Nachdem SET CONTEXT_INFO ausgeführt wurde, ist der neue Wert sofort aus den folgenden Quellen verfügbar:

  • Aus der CONTEXT_INFO-Funktion:

    SELECT CONTEXT_INFO() AS MyCtxInfo;
    
  • Aus der context_info-Spalte in der sys.dm_exec_requests-Zeile, die dem aktuellen Batch zugeordnet ist.

    SELECT context_info AS MyCtxInfo
    FROM sys.dm_exec_requests
    WHERE session_id = @@SPID
       AND request_id = CURRENT_REQUEST_ID();
    
  • Aus der context_info-Spalte in der sys.sysprocesses-Zeile, die dem aktuellen Batch zugeordnet ist.

    SELECT context_info AS MyCtxInfo
    FROM sys.sysprocesses
    WHERE spid = @@SPID;
    

Der neue Wert wird erst dann an die sys.dm_exec_sessions-Sicht weitergegeben, wenn die Ausführung des Batches, der die SET CONTEXT_INFO-Anweisung enthält, abgeschlossen ist. Wenn die Batchausführung abgeschlossen ist, wird der neue Wert in der Zeile platziert, die der aktuellen Sitzung zugeordnet ist.

SELECT context_info AS MyCtxInfo
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;

Das folgende Beispiel veranschaulicht, wann ein neuer Wert der Informationen zum Sitzungskontext in den Systemsichten oder in der CONTEXT_INFO-Funktion sichtbar ist:

-- Set a context value before the batch starts.
SET CONTEXT_INFO 0x9999
GO
-- Set a new context value in the batch.
SET CONTEXT_INFO 0x8888

-- Shows the new value available in the
-- sys.dm_exec_requests view while still in the batch.
SELECT context_info as RequestCtxInfoInBatch
FROM sys.dm_exec_requests
WHERE session_id = @@SPID
   AND request_id = CURRENT_REQUEST_ID();

-- Shows the new value available from the
-- CONTEXT_INFO function while still in the batch.
SELECT CONTEXT_INFO() AS FuncCtxInfoInBatch;

-- Shows that the sys.dm_exec_sessions view still
-- returns the old value in the batch.
SELECT context_info AS SessCtxInfoInBatch
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;

-- Shows the new value available in the
-- sys.sysprocesses view while still in the batch.
SELECT context_info AS ProcsCtxInfoInBatch
FROM sys.sysprocesses
WHERE spid = @@SPID;

-- End the batch.
GO

-- Shows that the sys.dm_exec_sessions view now
-- returns the new value.
SELECT context_info AS SessCtxInfoAfterBatch
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;

Informationen zum Sitzungskontext und MARS

MARS (Multiple Active Result Sets) ermöglicht es Anwendungen, mehrere Batches oder Anforderungen gleichzeitig über dieselbe Verbindung auszuführen.

Wenn einer der Batches auf einer MARS-Verbindung die SET CONTEXT_INFO-Anweisung ausführt, ist der neue Kontextwert sofort aus den folgenden Quellen verfügbar:

  • Aus der CONTEXT_INFO-Funktion, die vom selben Batch ausgeführt wird, der auch den Wert festgelegt hat.

  • Aus der Zeile in der sys.dm_exec_requests-Sicht, die dem Batch zugeordnet ist, der den Wert festgelegt hat.

Der neue Kontextwert wird erst dann an die folgenden Quellen weitergegeben, wenn die Ausführung des Batches, der den Wert festlegt, abgeschlossen ist:

  • Aus der CONTEXT_INFO-Funktion, die von einem anderen Batch ausgeführt wird als der Batch, der den Wert festgelegt hat. CONTEXT_INFO gibt den neuen Wert nur in Batches zurück, die nach dem Abschluss des Batches gestartet werden, der den Wert festgelegt hat.

  • Aus der Zeile in der sys.dm_exec_sessions-Sicht, die dem Batch zugeordnet ist, der den Wert festgelegt hat.