Ao consultar sys.dm_exec_sessions
é possível anexar o session_context?
Tenho um backend com um pool de 100 conexões. Quando uma conexão é atribuída a uma nova solicitação de entrada, armazeno o usuário que faz essa solicitação no session_context
.
exec sp_set_session_context @Key = N'User', @Value = @user_id
Agora, quando enfrento um impasse, gostaria de identificar os usuários envolvidos, obtendo o session_context
valor 'Usuário' de cada um sys.dm_exec_sessions
.
É possível? Obrigado.
Embora o ChatGPT possa sugerir que é possível, não, você não pode alterar o . de outra pessoa
SESSION_CONTEXT
. Você nem consegue vê-lo. Isso é por design - o contexto de uma sessão é privado para essa sessão, assim como as tabelas #temp.O aplicativo poderia (no login do usuário, talvez?) armazenar informações junto com
session_id
uma tabela com chave de sessão, por exemploEntão, no login, o aplicativo pode enviar:
Também poderia definir
SESSION_CONTEXT()
, mas não parece que isso será útil no seu caso de uso porque somente eles poderiam vê-lo. No entanto, tenho que me perguntar com que frequência você reagirá a um deadlock rápido o suficiente para que as sessões ainda estejam ativas . Pode ser que você precise de um log em execução, por exemplo:Depois é só inserir no login:
Agora que você sabe o horário do deadlock, você pode descobrir os usuários envolvidos dizendo:
Embora normalmente seja recomendado usar o mais novo
sp_set_session_context
, é impossível obter essas informações de uma conexão diferente, e elas não estão disponíveis no XEvents ou em nenhum dos DMVs.Em vez disso, você pode usar o mais antigo
CONTEXT_INFO
. Observe que ele só permite um máximo de 128 bytes, e você pode querer verificar se ninguém mais o está usando, pois não há chaves.Você pode usar
SELECT CONTEXT_INFO();
para visualizá-lo ou obtê-lo dacontext_info
coluna em ambosdm_exec_sessions
edm_exec_requests
. Também está disponível em sessões XEvent, sob ocontext_info
campo.