Usando informações de contexto de sessão

Informações de contexto de sessão permitem que aplicativos definam valores binários de até 128 bytes que podem ser mencionados em vários lotes, procedimentos armazenados, gatilhos ou funções definidas pelo usuário que operam na mesma sessão. Você pode definir um valor de contexto de sessão usando a instrução SET CONTEXT_INFO e recuperá-lo usando um dos seguintes itens:

  • A função CONTEXT_INFO.

  • As colunas context_info em sys.dm_exec_requests e exibições de gerenciamento dinâmicas sys.dm_exec_sessions e exibição de compatibilidade sys.sysprocesses.

Informações de contexto de sessão diferem de variáveis Transact-SQL, cujo escopo é limitado ao lote atual Transact-SQL, procedimento armazenado, gatilho ou função definida pelo usuário. Informações de contexto de sessão podem ser usadas para armazenar informações específicas de cada usuário ou estado atual do aplicativo. Depois, isso pode ser usado para controlar a lógica em instruções Transact-SQL.

A função CONTEXT_INFO é o modo preferido para recuperar o contexto de sessão da sessão atual. Você também pode recuperar valores de contexto de sessão para todas as sessões atuais e lotes das colunas context_info em sys.dm_exec_requests ou exibições de gerenciamento dinâmicas sys.dm_exec_sessions. Para selecionar essas exibições, são necessárias as permissões SELECT e VIEW SERVER STATE. Essas permissões não são exigidas quando você usa a função CONTEXT_INFO.

O principal uso de informações de contexto de sessão é a definição de um valor que pode ser persistido em vários lotes da mesma sessão. O exemplo a seguir mostra como definir um valor que pode ser consultado depois que forem executados vários lotes.

-- 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

Valores de informações de contexto de sessão

Se a função SET CONTEXT_INFO ainda não tiver sido executada para a sessão atual, os seguintes valores de sessão serão informados:

  • A função CONTEXT_INFO retorna NULL.

  • Os valores de coluna context_info nas exibições de sistema são definidos como 128 bytes de zeros binários para linhas associadas com a sessão e solicitação atuais.

Depois que SET CONTEXT_INFO é executada, o novo valor fica imediatamente disponível a partir das seguintes fontes:

  • A função CONTEXT_INFO:

    SELECT CONTEXT_INFO() AS MyCtxInfo;
    
  • A coluna context_info na linha sys.dm_exec_requests associada com o lote atual:

    SELECT context_info AS MyCtxInfo
    FROM sys.dm_exec_requests
    WHERE session_id = @@SPID
       AND request_id = CURRENT_REQUEST_ID();
    
  • A coluna context_info na linha sys.sysprocesses associada com a sessão atual:

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

O novo valor não é propagado na exibição sys.dm_exec_sessions até que o lote que contém a instrução SET CONTEXT_INFO finalize a execução. Quando o lote for finalizado, o novo valor será colocado na linha associada com a sessão atual.

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

O exemplo seguinte mostra quando um novo valor de informação de contexto de sessão é visível nas exibições de sistema ou na função 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;

Informação de contexto de sessão e MARS

MARS (Vários Conjuntos de Resultados Ativos) permitem que os aplicativos executem vários lotes ou solicitações, ao mesmo tempo na mesma conexão.

Quando um dos lotes em uma conexão MARS executa SET CONTEXT_INFO, o novo valor de contexto fica imediatamente disponível a partir das seguintes fontes:

  • A partir da função CONTEXT_INFO que é executada pelo mesmo lote que definiu o valor.

  • A linha na exibição sys.dm_exec_requests que é associada com o lote que definiu o valor.

O novo valor de contexto não é propagado nas fontes seguintes até que o lote que define o valor finalize a execução:

  • A função CONTEXT_INFO que é executada por um lote diferente do lote que definiu o valor. CONTEXT_INFO só retornará o novo valor em lotes que foram iniciados após a conclusão do lote que definiu o valor.

  • A linha na exibição sys.dm_exec_sessions associada com o lote que definiu o valor.