Eu estava definindo um trabalho SQL ontem para executar o procedimento armazenado em um horário específico da manhã. Era um requisito ad-hoc e urgente e, portanto, desenvolvi esse procedimento rapidamente e o programei para ser executado todas as manhãs.
Eu deveria estar apenas chamando o procedimento na etapa do trabalho e definir o arquivo de saída na guia avançada. Eu tive que usar o comando abaixo dentro da etapa do trabalho:
use db_name
go
exec sp_name
go
Em vez de acima, escrevi como abaixo por engano:
begin tran
go
exec sp_name
go
Este trabalho sql não falhou, mas não fez o trabalho pretendido.
O arquivo de saída contém abaixo:
Job 'Job_Name': Etapa 1, 'Step_name': começou a executar 2020-02-03 06:10:00
O que parece estar correto, no entanto, eu queria saber que acima poderia manter uma transação aberta e poderia causar outros problemas.
Eu executei sp_whoisactive
(graças ao Sr. Adam Machanic) e não vejo nenhuma sessão em execução a partir desse momento, assim como não há bloqueio em nenhuma tabela, pois o procedimento subjacente estava tendo uma dica de tabela tablock ao inserir dados na tabela.
Existe alguma maneira de descobrir o que realmente aconteceu com esse trabalho sql e por que ele não fez o trabalho pretendido, bem como se há alguma maneira de descobrir se ele ainda está sendo executado em segundo plano e pode ser confirmado ou revertido. Executei sp_who2 também para ver se existe algum SPID associado a este job, não encontrei nada.
Executou a consulta abaixo para verificar o status de todos os trabalhos e mostra que meu trabalho foi bem-sucedido:
USE MSDB
SELECT name AS [Job Name]
,CONVERT(VARCHAR,MAX(DATEADD(S,(run_time/10000)*60*60 /* hours */
+((run_time - (run_time/10000) * 10000)/100) * 60 /* mins */
+ (run_time - (run_time/100) * 100) /* secs */
,CONVERT(DATETIME,RTRIM(run_date),113))),100) AS [Time Run]
,CASE WHEN enabled=1 THEN 'Enabled'
ELSE 'Disabled'
END [Job Status]
,CASE WHEN SJH.run_status=0 THEN 'Failed'
WHEN SJH.run_status=1 THEN 'Succeeded'
WHEN SJH.run_status=2 THEN 'Retry'
WHEN SJH.run_status=3 THEN 'Cancelled'
ELSE 'Unknown'
END [Job Outcome]
FROM sysjobhistory SJH
JOIN sysjobs SJ
ON SJH.job_id=sj.job_id
WHERE step_id=0
AND DATEADD(S,
(run_time/10000)*60*60 /* hours */
+((run_time - (run_time/10000) * 10000)/100) * 60 /* mins */
+ (run_time - (run_time/100) * 100) /* secs */,
CONVERT(DATETIME,RTRIM(run_date),113)) >= DATEADD(d,-20,GetDate())
group by name, CASE WHEN enabled=1 THEN 'Enabled'
ELSE 'Disabled'
END
,CASE WHEN SJH.run_status=0 THEN 'Failed'
WHEN SJH.run_status=1 THEN 'Succeeded'
WHEN SJH.run_status=2 THEN 'Retry'
WHEN SJH.run_status=3 THEN 'Cancelled'
ELSE 'Unknown'
END
Qualquer ajuda ou entrada é muito apreciada.
Versão: Microsoft SQL Server 2014 (SP3-GDR) (KB4505218) - 12.0.6108.1 (X64) 29 de maio de 2019 20:05:27 Copyright (c) Microsoft Corporation Enterprise Edition: Licenciamento baseado em núcleo (64 bits) no Windows NT 6.3 (Build 9600: ) (Hipervisor)
Quando você faz isso em um trabalho, basicamente encerra a sessão e reverte a transação quando o trabalho termina. Você pode rastrear isso usando a
SQLTransaction
classe de evento no Profiler. Essa é a razão pela qual você não vê nenhuma transação/sessão aberta ou o trabalho sendo feito.