Utilisation des informations de contexte de session
Les informations de contexte de session permettent aux applications de définir des valeurs binaires jusqu'à 128 octets pouvant être référencées en plusieurs traitements, de procédures stockées, de déclencheurs ou de fonctions définies par l'utilisateur exécutées au cours de la même session. Vous pouvez définir un contexte de session à l'aide de l'instruction SET CONTEXT_INFO, puis extraire celui-ci en utilisant un des éléments suivants :
La fonction CONTEXT_INFO.
Les colonnes context_info dans les vues de gestion dynamique sys.dm_exec_requests et sys.dm_exec_sessions et dans la vue de compatibilité sys.sysprocesses.
Les informations de contexte de session sont différentes des variables Transact-SQL, dont la portée est limitée au traitement Transact-SQL, à la procédure stockée, au déclencheur ou à la fonction définie par l'utilisateur en cours. Les informations de contexte de session peuvent être utilisées pour stocker des informations spécifiques à chaque utilisateur ou des informations relatives à l'état actuel de l'application. Elles peuvent ensuite servir à contrôler la logique d'instructions Transact-SQL.
L'utilisation de la fonction CONTEXT_INFO est la méthode privilégiée pour récupérer les informations de contexte pour la session en cours. Vous pouvez également récupérer des valeurs de contexte de session pour toutes les sessions et tous les traitements en cours dans les colonnes context_info des vues de gestion dynamique sys.dm_exec_requests et sys.dm_exec_sessions. Pour sélectionner une valeur dans ces vues, vous devez avoir les autorisations SELECT et VIEW SERVER STATE. Ces autorisations ne sont pas obligatoires lorsque vous utilisez la fonction CONTEXT_INFO.
Les informations de contexte de session servent principalement à définir une valeur qui peut être rendue persistante dans plusieurs traitements au cours d'une même session. L'exemple suivant illustre la définition d'une valeur qui peut être référencée après l'exécution de plusieurs traitements.
-- Set context information at start.
SET CONTEXT_INFO 0x125666698456;
GO
-- Perform several nonrelated batches.
EXEC sp_helpfile;
GO
USE AdventureWorks;
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
Valeurs des informations de contexte de session
Si l'instruction SET CONTEXT_INFO n'a pas encore été exécutée pour la session en cours, les valeurs de session suivantes sont retournées :
La fonction CONTEXT_INFO retourne NULL.
Les valeurs de la colonne context_info dans les vues système sont remplacées par 128 octets de zéros binaires pour les lignes associées à la session et la demande en cours.
Une fois que l'instruction SET CONTEXT_INFO a été exécutée, la nouvelle valeur est immédiatement disponible dans les sources suivantes :
La fonction CONTEXT_INFO :
SELECT CONTEXT_INFO() AS MyCtxInfo;
La colonne context_info de la ligne sys.dm_exec_requests associée au traitement en cours :
SELECT context_info AS MyCtxInfo FROM sys.dm_exec_requests WHERE session_id = @@SPID AND request_id = CURRENT_REQUEST_ID();
La colonne context_info de la ligne sys.sysprocesses associée à la session en cours :
SELECT context_info AS MyCtxInfo FROM sys.sysprocesses WHERE spid = @@SPID;
La nouvelle valeur n'est pas propagée à la vue sys.dm_exec_sessions tant que le traitement qui contient l'instruction SET CONTEXT_INFO est en cours d'exécution. Lorsque le traitement a fini de s'exécuter, la nouvelle valeur est placée dans la ligne associée à la session en cours.
SELECT context_info AS MyCtxInfo
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID;
L'exemple suivant indique le moment où une nouvelle valeur d'information de contexte de session est visible dans les vues système ou dans la fonction CONTEXT_INFO :
-- 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;
Informations de contexte de session et MARS
Les ensembles de résultats actifs multiples (MARS, Multiple Active Result Sets) permettent aux applications d'exécuter plusieurs traitements ou demandes simultanément lors de la même connexion.
Lorsqu'un des traitements d'une connexion MARS exécute SET CONTEXT_INFO, la nouvelle valeur de contexte est immédiatement disponible dans les sources suivantes :
La fonction CONTEXT_INFO qui est exécutée par le même traitement ayant défini la valeur.
La ligne dans la vue sys.dm_exec_requests qui est associée au traitement ayant défini la valeur.
La nouvelle valeur de contexte n'est pas propagée aux sources suivantes tant que le traitement ayant défini la valeur est en cours d'exécution :
La fonction CONTEXT_INFO qui est exécutée par un autre traitement que celui ayant défini la valeur. La fonction CONTEXT_INFO retourne la nouvelle valeur uniquement dans les traitements qui sont démarrés après l'exécution du traitement ayant défini la valeur.
La ligne dans la vue sys.dm_exec_sessions qui est associée au traitement ayant défini la valeur.