Função SQL Server SESSION_CONTEXT () com exemplos

Função SQL Server SESSION_CONTEXT () com exemplos

Função SQL Server SESSION_CONTEXT () com exemplos 1


Este artigo explora a função de contexto de sessão do SQL Server, SESSION_CONTEXT () e executa sua comparação com
    a função CONTEXT_INFO ().

Introdução

Os desenvolvedores estão familiarizados com o mecanismo para armazenar e recuperar a sessão em uma linguagem de programação como o ASP.Net.
    Antes do SQL Server 2016, usamos a função CONTEXT_INFO. Recuperamos valores de contexto da sessão para todas as sessões ativas
    usando esta função CONTEXT_INFO.

  • CONTEXT_INFO retorna um único valor binário. Precisamos converter esse valor binário em um formato de dados compatível

  • O valor binário é limitado a 128 bytes por conexão

Contexto da sessão do SQL Server

  • Os usuários podem substituir o valor a qualquer momento. Isso pode levar à segurança, problemas relacionados à auditoria

  • Não podemos usar esta função no banco de dados SQL do Azure

  • Usuários com a permissão VIEW SERVER STATE e a permissão SELECT necessária podem usar sys.dm_exec_sessions da DMV e
            sys.dm_exec_requests para recuperar o valor de contexto para o ID da sessão

Função CONTEXT_INFO

O SQL Server 2016 introduziu uma nova função interna SESSION_CONTEXT () como melhoria em relação ao existente
Função CONTEXT_INFO. Ele usa pares de valores-chave para armazenar os dados da sessão. Funciona com o SQL Azure
    banco de dados também.

Definimos esses pares de valores-chave usando o procedimento armazenado sp_set_session_context.

A função de contexto de sessão Sintaxe do SQL Server SESSION_CONTEXT ()

A sintaxe de sp_set_session_context

Requer os seguintes parâmetros.

  • @Chave: É a chave que definimos. É do tipo SYSNAME e pode ter até 256 bytes
  • @valor: É um valor para a chave especificada. Seu tipo é sql_variant. Seu tamanho máximo é de 8.000 bytes
  • @somente leitura: Podemos especificar o valor para este sinalizador como 0,1
    • 1: Não podemos alterar a chave na conexão lógica
    • 0: Podemos alterar o valor da chave se read_only estiver definido como zero

Vamos explorar o SESSION_CONTEXT () usando vários exemplos.

Exemplo 1 Use SESSION_CONTEXT () para uma recuperação de chave

Neste exemplo, configuramos uma chave CustomerID e definimos seu valor 101. Posteriormente, usamos o contexto da sessão do SQL Server
    função SESSION_CONTEXT () e recupere a chave para isso.

função de contexto SESSION_CONTEXT ()

Exemplo 2: Atualizar valor para uma chave na sessão

Neste exemplo, atualizamos um valor-chave na mesma sessão. Para atualizar o valor, não exigimos nenhum outro armazenamento
    procedimento. Executamos sp_set_session_context com um valor diferente para uma chave existente.

Atualizar valor para uma chave na sessão

Na saída acima, vemos o valor atualizado no 2nd Saída da instrução SESSION_CONTEXT ().

Exemplo 3: Atualizar valor para uma chave somente leitura na sessão

O procedimento do sistema sp_set_session_context aceita três parâmetros, conforme mostrado acima na sintaxe. Nós não usamos o
    terceiro parâmetro @read_only no exemplo anterior. Por padrão, o SQL Server usa o valor padrão 0 para o
    @read_only. Vamos configurá-lo para 1 usando a seguinte consulta.

Ele define o valor da chave CustomerID como 101. Agora, vamos tentar atualizar o valor da chave. Recebemos a mensagem de que ele não pode definir o valor da chave no contexto da sessão porque está definido como somente leitura, conforme mostrado na captura de tela a seguir.

Atualizar valor para uma chave somente leitura na sessão

Exemplo 4: Verifique a saída da função de contexto da sessão do SQL Server SESSION_CONTEXT () sem definir o valor para a chave

Neste exemplo, não definimos nenhuma chave usando o procedimento sp_set_session_context. Isso significa que a chave não está
    válido. Se tentarmos acessar o valor-chave usando SESSION_CONTEXT (), ele sempre retornará um valor NULL.

Exemplo 5: definir uma chave sem o prefixo N

Neste exemplo, definimos uma chave CutomerID e configuramos seu valor como 101

Vamos tentar obter o valor do contexto da sessão sem especificar o prefixo N no nome da chave.

Retorna uma mensagem de erro sobre o tipo de dados inválido varchar ().

Verifique a saída da função de contexto da sessão do SQL Server

Mostra claramente que a função de contexto da sessão do SQL Server, a função SESSION_CONTEXT (), requer dados NVARCHAR
    digite para sua chave.

Exemplo 6: Uso da função de contexto de sessão do SQL Server SESSION_CONTEXT () em um procedimento armazenado

No exemplo anterior, definimos uma chave e seu valor diretamente em uma sessão. Neste exemplo, usaremos o contexto da sessão em um procedimento armazenado.

Este procedimento verifica o contexto da sessão para uma chave Mango. Exigimos a saída em um tipo de dados VARCHAR, portanto usamos
    a função SQL CONVERT para alterar o tipo de dados de NVARCHAR para VARCHAR.

Execute este procedimento armazenado e ele retornará valor NULL na saída porque não especificamos o valor para a chave
    usando o sp_set_session_context procedimento armazenado.

Contexto da sessão para procedimento armazenado

Agora, execute o procedimento armazenado novamente depois de definir a chave e seu valor.

Nós obtemos a saída esperada, como mostrado abaixo.

resultado esperado

O valor da chave é persistente ao longo da sessão. Podemos executar o procedimento armazenado várias vezes e ele retorna o mesmo valor em cada execução.

Se executarmos esse procedimento em uma sessão diferente, ele retornará um valor NULL porque não definimos o valor da chave para esta sessão.
Compare a execução do procedimento armazenado

Essas chaves são independentes em diferentes sessões. Por exemplo, na captura de tela a seguir, temos valores diferentes
    para a chave de frutas nas sessões 1 e 2.

Recuperamos o contexto da sessão na sessão específica e obtemos o valor-chave definido apenas nessa sessão. Não substitui da outra sessão.

o comportamento do valor-chave

Limitação de pares de chave e valores no contexto da sessão do SQL Server

Conforme destacado no início deste artigo, temos as seguintes limitações para os pares de valor-chave.

  • A chave pode conter no máximo 256 bytes (128 caracteres Unicode)

  • Um valor pode conter até 8000 bytes

  • O tamanho total de um par de valores-chave no contexto de segurança não pode exceder além de 1 MB

Essas limitações estão no SQL Server 2019. Podemos ter valores diferentes para ele no SQL Server 2016 e 2017.

Vamos ver essas restrições usando exemplos. Na consulta a seguir, usamos uma função REPLICATE () para replicar o valor A 129 vezes na variável @text.

DECLARAR @text NVARCHAR (129) = REPLICATE (N’A ‘, 129);

Recebemos a seguinte mensagem de erro porque o tamanho da chave excedeu 256 bytes.

Limitação de pares de chave e valores

Da mesma forma, o tamanho total da chave e o valor em uma sessão não podem exceder o limite de 1 MB. O código a seguir define algumas chaves e valores até chegar ao intervalo de 1 MB. Depois de ultrapassar o limite, você recebe a mensagem de erro destacada mostrada abaixo.

Limitação de pares de chave e valores para tamanho total

Monitorar o uso da memória do contexto da sessão para o contexto da sessão do SQL Server

Podemos usar a exibição de gerenciamento dinâmico sys.dm_os_memory_cache_counters para monitorar o uso da memória cache de todos os
    sessões.

Vamos fechar todas as sessões e especificar uma chave e um valor usando a consulta a seguir.

Agora, execute a DMV e verifique o uso da memória cache. A captura de tela abaixo mostra que atualmente temos um único
    chave e está usando 8 KB.

Monitorar o uso da memória de contexto da sessão

  • pages_kb: é a quantidade de memória (em KB) alocada no cache
  • inputs_count: é o número de entradas no cache

Agora, execute a seguinte consulta em uma nova janela de consulta para gerar 10 chaves e valores usando um loop WHILE.

Depois de consultar o DMV, ele mostra o uso de memória das duas sessões. A primeira sessão está usando uma tecla enquanto outra sessão está usando 10 teclas.

Monitorar o uso da memória de contexto da sessão para várias chaves

Conclusão

Neste artigo, exploramos a função de contexto da sessão SESSION_CONTEXT () para gerenciar a variável de sessão no SQL
    Servidor. É um aprimoramento sobre CONTEXT_INFO () e está disponível no SQL Server 2016 em diante. Também podemos explorar sua
    casos de uso com o recurso de segurança em nível de linha no SQL Server.

Rajendra Gupta
Últimas mensagens de Rajendra Gupta (ver todos)

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
Leia Também  Melhore a legibilidade com as perspectivas do SSAS