Estou configurando um trabalho para obter o SPID de um processo ofensivo e eliminá-lo. Estou usando uma mistura entre o ótimo sp_Whoiscative de @AdamMachanic e juntando-se a sysprocesses no nome de login e valores SPID e session_id , pois esses devem ser os mesmos (ou estou errado e esse é o meu erro?).
Estou obtendo algo que não entendo: para um mesmo SPID de sysprocesses, estou obtendo diferentes valores de session_id de resultados whoisactive. O que está incorreto aqui?
Aqui está o código que estou usando. O filtro para obter valores 10s antes da data e hora atual é porque o whoisactive está executando com o parâmetro @deltainterval que leva cerca de 10s para ser executado a cada execução.
USE master;
-- Log information about current running processes to table Log_WhoIsActive
EXEC [master].[dbo].[sp_WhoIsActive]
@get_full_inner_text = 1,
@get_plans = 2,
@get_outer_command = 1,
@get_transaction_info = 1,
@get_task_info = 2,
@get_locks = 1,
@get_avg_time = 1,
@get_additional_info = 1,
@delta_interval = 2,
@sort_order = '[start_time] DESC',
@destination_table = 'Log_WhoIsActive_tests';
--compare date from sysprocesses with data gathered on sp_whosiactive
SELECT dt.collection_time, sp.spid, dt.[dd hh:mm:ss.mss], sp.loginame,
dt.login_name, dt.session_id
FROM sys.sysprocesses sp JOIN Log_WhoIsActive_tests dt
ON sp.loginame = dt.login_name
WHERE sp.loginame = 'my_login_name'
AND sp.status = 'runnable'
AND sp.spid > 50
AND dt.collection_time > DATEADD(ss, -10, GETDATE());
SPID === id_da_sessão.
O que você está vendo é um produto cartesiano, pois está ingressando em um campo que não é exclusivo no conjunto de dados. Você tem atualmente:
Você provavelmente deve, no mínimo, adicionar a seguinte condição a esse JOIN:
Além disso, por favor, não use
sysprocesses
. Ele foi substituído quando o SQL Server 2005 foi lançado e asys.sysprocesses
"tabela" que você está usando é apenas uma exibição de compatibilidade. A página do MSDN para sys.sysprocesses ainda tem uma nota na parte superior informando:Em vez disso, você deve usar o novo DMV (Dynamic Management Views):
Observe que um login pode precisar receber a permissão de nível de servidor
VIEW SERVER STATE
para ver mais do que seus próprios dados parasys.dm_exec_sessions
esys.dm_exec_requests
, ou ver qualquer coisa emsys.dm_exec_connections
.Se essa permissão for necessária, o banco de dados atual quando você executar a
GRANT
instrução precisará sermaster
, pois essa é uma permissão no nível do servidor.