Usuário com melhor resposta
Fazer uma TRIGGER virar um JOB

Pergunta
-
Olá, estou com a seguinte situação, preciso transformar a seguinte trigger em um Job, porém meu SQL Agent não está ativo e mesmo eu iniciando o serviço do Agent, ele não aparece para mim no meu sql(versão 2017). Existe algum script que eu possa utilizar para transformar a trigger abaixo em um job, ou seja, criar o Job manualmente?
Minha TRIGGER:
USE [GrowMonitor_BP]
GO
/****** Object: Trigger [dbo].[ATUALIZA_TB_HISTORICO] Script Date: 06/01/2020 14:38:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[ATUALIZA_TB_HISTORICO]
ON [dbo].[TB_HISTORICO_WORKFLOW]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF OBJECT_ID('TEMPDB..#TEMP') IS NOT NULL DROP TABLE #TEMP
IF OBJECT_ID('TEMPDB..#AGENTES') IS NOT NULL DROP TABLE #AGENTES
SELECT * INTO #AGENTES FROM (
SELECT
D.*,
CASE
--WHEN D.AgentName IS NULL THEN (SELECT DISTINCT TOP 1 Z.AgentName FROM [BDRPA].[dbo].[instances] Z WHERE Z.TransactionID = D.TransactionID AND Z.AgentName != '' AND Z.AgentName IS NOT NULL)
--WHEN D.AgentName = '' THEN (SELECT DISTINCT TOP 1 C.AgentName FROM [BDRPA].[dbo].[instances] C WHERE C.TransactionID = D.TransactionID AND C.AgentName != '' AND C.AgentName IS NOT NULL)
WHEN D.AgentName IS NULL THEN (SELECT DISTINCT TOP 1 Z.AgentName FROM [AutomateEnterprise].[dbo].[instances] (NOLOCK) Z WHERE Z.WorkflowInstanceID = D.WorkflowInstanceID AND Z.AgentName != '' AND Z.AgentName IS NOT NULL)
WHEN D.AgentName = '' THEN (SELECT DISTINCT TOP 1 C.AgentName FROM [AutomateEnterprise].[dbo].[instances] (NOLOCK) C WHERE C.WorkflowInstanceID = D.WorkflowInstanceID AND C.AgentName != '' AND C.AgentName IS NOT NULL)
ELSE D.AgentName
END Agente
FROM
(
SELECT P.AgentID, P.AgentName, P.StartDateTime, P.EndDateTime, P.TransactionID, P.WorkflowInstanceID, P.ResultCode, P.Status, P.ConstructID, CAST(P.ResultText AS NVARCHAR(max)) AS ResultText
FROM
(
SELECT T1.AgentID, T1.AgentName, T1.StartDateTime, T1.EndDateTime, T1.ResultCode, T1.Status, T1.TransactionID ,T1.WorkflowInstanceID, T1.ConstructID, T1.ResultText
FROM [AutomateEnterprise].[dbo].[instances] (NOLOCK) T1 WHERE T1.EndDateTime > DateAdd(DD,-3,GETDATE() )
UNION ALL
SELECT T2.AgentID, NULL, T2.StartDateTime, T2.EndDateTime, T2.ResultCode, NULL, T2.TransactionID, T2.WorkflowInstanceID, T2.ConstructID, T2.ResultText
FROM [AutomateEnterprise].[dbo].[executionevents] (NOLOCK) T2 WHERE T2.EndDateTime > DateAdd(DD,-3,GETDATE() )
)
AS P
WHERE P.AgentID IN (SELECT DISTINCT TB0.AgentID FROM [AutomateEnterprise].[dbo].[instances] (NOLOCK) TB0)
GROUP BY P.AgentID, P.AgentName, P.StartDateTime, P.EndDateTime, P.TransactionID, P.WorkflowInstanceID, P.ResultCode, P.Status, P.ConstructID, CAST(P.ResultText AS NVARCHAR(MAX))
) AS D
) TBL_TMP
/* Selecionar ultima linha de cada agente */
SELECT ID = IDENTITY(int,1,1), TABELA_TEMP.* INTO #TEMP FROM (
SELECT ResourceID AS ID_AGENTE, Agente AS AGENTES, WorkflowInstanceID, ConstructID, TransactionID, StartDateTime, EndDateTime, ResultText, ResultCode
FROM (SELECT A.Agente,
AG.ResourceID,
A.WorkflowInstanceID,
A.ConstructID,
A.TransactionID,
A.AgentID,
A.StartDateTime,
A.EndDateTime,
A.ResultText,
A.ResultCode,
Row_number() OVER(PARTITION BY Agente ORDER BY EndDateTime DESC ) RN
FROM #AGENTES (NOLOCK) A
INNER JOIN [AutomateEnterprise].[dbo].[automateconstructs] (NOLOCK) AG ON A.Agente = AG.ResourceName
) t
WHERE RN = 1 ) AS TABELA_TEMP
/*Iniciar transação para incluir (INSERT)
ou alterar (UPDATE) os valores no banco */
BEGIN TRAN
/* Aqui ocorre a verificação do agente, workflow e tarefa */
IF NOT EXISTS
(
SELECT *
FROM GrowMonitor_BP.[dbo].TB_HISTORICO_WORKFLOW (NOLOCK) TB
WHERE
TB.IDWORKFLOW =
(
SELECT TOP 1 U.ConstructID /* ConstructID é o IDWORFLOW */
FROM #AGENTES (NOLOCK) U
WHERE U.TransactionID = (SELECT TOP 1 T.TransactionID FROM #TEMP (NOLOCK) T WHERE T.EndDateTime = (SELECT MAX(A.EndDateTime) FROM #TEMP (NOLOCK) A))
AND U.ConstructID != ''
AND U.ResultText LIKE '%workflow%'
AND U.ResultText NOT LIKE '%Administrator%'
-- AND U.ResultText NOT LIKE '%Task%'
ORDER BY U.EndDateTime DESC
)
AND TB.FLAG IN (2) /* Aguardando, Em Execução*/
AND TB.AGENTE_NAME =
(
SELECT TOP 1 U.Agente
FROM #AGENTES U
WHERE U.TransactionID = (SELECT TOP 1 T.TransactionID FROM #TEMP T WHERE T.EndDateTime = (SELECT MAX(A.EndDateTime) FROM #TEMP A))
AND U.ConstructID != ''
AND U.ResultText LIKE '%workflow%'
ORDER BY U.EndDateTime DESC
)
AND TB.IDWORKFLOW = (
SELECT TOP 1 TX.IDWORKFLOW
FROM GrowMonitor_BP.[dbo].TB_HISTORICO_WORKFLOW (NOLOCK) TX
INNER JOIN #AGENTES U ON U.ConstructID = TX.IDWORKFLOW
WHERE TB.IDWORKFLOW = TX.IDWORKFLOW
AND TB.AGENTE_NAME = TX.AGENTE_NAME
)
AND TB.DTHR_INICIO = (
SELECT TOP 1 TG.DTHR_INICIO
FROM GrowMonitor_BP.[dbo].TB_HISTORICO_WORKFLOW (NOLOCK) TG
WHERE TG.DTHR_INICIO = TB.DTHR_INICIO
AND (TG.FLAG = 1 OR TG.FLAG = 2 OR TG.FLAG = 3)
)
)
BEGIN
--PRINT 'EXECUTANDO INSERT'
INSERT INTO GrowMonitor_BP.[dbo].TB_HISTORICO_WORKFLOW
(IDWORKFLOW, FLAG, DTHR_INICIO, DTHR_FIM, OBS, AGENTE_NAME, DIRETORIO, TRANSACTIONID)
SELECT TOP 1 U.ConstructID,
CASE
WHEN U.ResultCode = 12 /* Running */
THEN 2 /* Em Execução */
WHEN U.ResultCode = 11 /* Queued */
THEN 3 /* Erro de Execução - Informar na observação para iniciar em outro agente*/
WHEN U.ResultCode = 10 /* unknow status */
THEN 4 /* Em Observação */
WHEN U.ResultCode = 9 /* paused */
THEN 0 /* Aguardando Execução */
WHEN U.ResultCode = 8 /* halted breakpoint */
THEN 4 /* Em Observação */
WHEN U.ResultCode = 4/* stopped */
THEN 3 /* Erro de Execução */
WHEN U.ResultCode = 2 /* failed */
THEN 3 /* Erro de Execução */
WHEN (U.ResultCode = 1 AND U.ResultText LIKE '%manually%') /* manually */
THEN 2 /* Em execução */
WHEN (U.ResultCode = 1 AND U.ResultText NOT LIKE '%manually%') /* manually */
THEN 2 /* Em execução */
WHEN U.ResultCode = 0 /* stopped */
THEN 3 /* Erro de Execução */
ELSE U.ResultCode
END,
CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, U.StartDateTime), DATENAME(TzOffset, SYSDATETIMEOFFSET())))StartDateTime,
--CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, U.EndDateTime), DATENAME(TzOffset, SYSDATETIMEOFFSET())))EndDateTime,
'',
CASE
WHEN (U.ResultCode = 12) /* Running */
THEN 'Em execução - 1.' /* Em Execução */
WHEN (U.ResultCode = 11) /* Queued */
THEN 'Iniciar em outro agente.' /* Erro de Execução - Informar na observação para iniciar em outro agente*/
WHEN (U.ResultCode = 10) /* unknow status */
THEN 'Status desconhecido.' /* Em Observação */
WHEN (U.ResultCode = 9) /* paused */
THEN 'Aguardando execução.' /* Aguardando Execução */
WHEN (U.ResultCode = 8) /* halted breakpoint */
THEN 'Breakpoint encontrado.' /* Em Observação */
WHEN (U.ResultCode = 4) /* stopped */
THEN 'Parado manualmente.' /* Erro de Execução */
WHEN (U.ResultCode = 1 AND U.ResultText LIKE '%manually%') /* manually */
THEN 'Em execução - 2.' /* Em execução */
WHEN (U.ResultCode = 1 AND U.ResultText NOT LIKE '%manually%' AND U.TransactionID = (SELECT TOP 1 A.TransactionID FROM executionevents (NOLOCK) A WHERE A.TransactionID = U.TransactionID AND A.ResultText LIKE '%Task%' AND A.ResultText LIKE '%failed%' AND A.ResultText LIKE '%Erro%' AND A.ResultCode = 2))
THEN 'Erro de execução 1.' /* Erro de execução*/
WHEN (U.ResultCode = 2) /* failed */
THEN 'Erro de execução - 2.' /* Erro de Execução */
WHEN (U.ResultCode = 1 AND U.ResultText NOT LIKE '%manually%' AND U.TransactionID != (SELECT TOP 1 A.TransactionID FROM executionevents (NOLOCK) A WHERE A.TransactionID = U.TransactionID AND A.ResultText LIKE '%Task%' AND A.ResultText LIKE '%failed%' AND A.ResultCode = 2))
THEN 'Executado com sucesso - 1.' /* Sucesso */
WHEN (U.ResultCode = 1) /* sucesso */
THEN 'Executado com sucesso - 2.' /* Executado com sucesso */
WHEN (U.ResultCode = 0) /* stopped */
THEN 'Erro de execução - 3.' /* Erro de Execução */
ELSE CONVERT(VARCHAR, U.ResultCode)
END OBS,
U.Agente, (SELECT REPLACE ((SELECT TOP 1 CAST(CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, U.StartDateTime), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) AS TIME(0))), ':', '')),
U.TransactionID
FROM #AGENTES (NOLOCK) U
WHERE U.TransactionID = (SELECT TOP 1 T.TransactionID FROM #TEMP T WHERE T.EndDateTime = (SELECT MAX(A.EndDateTime) FROM #TEMP A) AND T.ResultCode = 12)
--AND U.ConstructID != ''
AND U.ResultText LIKE '%Workflow%'
AND U.ResultText LIKE '%running%'
AND U.ResultCode = 12
ORDER BY U.EndDateTime DESC
END
ELSE
BEGIN
--PRINT 'EXECUTANDO UPDATE'
UPDATE H
SET
H.FLAG =
(
CASE
WHEN T.ResultCode = 12 /* Running */
THEN '2' /* Em Execução */
WHEN (T.ResultText LIKE '%running%')
THEN '2' /* Em execução */
WHEN (T.ResultText LIKE '%Evaluation finished%')
THEN '2' /* Em execução */
WHEN (T.ResultCode = 1 AND T.ResultText LIKE '%manually%') /* manually */
THEN '2' /* Em execução */
WHEN T.ResultCode = 11 /* Queued */
THEN '3' /* Erro de Execução - Informar na observação para iniciar em outro agente*/
WHEN T.ResultCode = 10 /* unknow status */
THEN '4' /* Em Observação */
WHEN T.ResultCode = 9 /* paused */
THEN '0' /* Aguardando Execução */
WHEN T.ResultCode = 8 /* halted breakpoint */
THEN '4' /* Em Observação */
WHEN T.ResultCode = 4/* stopped */
THEN '3' /* Erro de Execução */
WHEN T.ResultCode = 2 /* failed */
THEN '3' /* Erro de Execução */
WHEN (T.ResultCode = 1 AND T.ResultText NOT LIKE '%manually%' AND T.ResultText NOT LIKE '%Evaluation%' AND T.ResultText NOT LIKE '%running%' AND T.TransactionID != (SELECT TOP 1 A.TransactionID FROM executionevents (NOLOCK) A WHERE A.TransactionID = T.TransactionID AND A.ResultText LIKE '%Task%' AND A.ResultText LIKE '%failed%' AND A.ResultCode = 2))
THEN '1' /* Sucesso */
WHEN (T.ResultCode = 1 AND T.ResultText NOT LIKE '%manually%' AND T.TransactionID = (SELECT TOP 1 A.TransactionID FROM executionevents (NOLOCK) A WHERE A.TransactionID = T.TransactionID AND A.ResultText LIKE '%Task%' AND A.ResultText LIKE '%failed%' AND A.ResultText LIKE '%Erro%' AND A.ResultCode = 2))
THEN '3' /* Erro de execução*/
WHEN T.ResultCode = 0 /* stopped */
THEN '3' /* Erro de Execução */
ELSE T.ResultCode
END
),
--H.DTHR_INICIO = T.StartDateTime,
H.DTHR_FIM = CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, T.EndDateTime), DATENAME(TzOffset, SYSDATETIMEOFFSET()))),
H.OBS =
CASE
WHEN (T.ResultCode = 12) /* Running */
THEN 'Em execução 1.' /* Em Execução */
WHEN (T.ResultCode = 1 AND T.ResultText LIKE '%manually%') /* manually */
THEN 'Em execução 2.' /* Em execução */
WHEN (T.ResultCode = 11) /* Queued */
THEN 'Iniciar em outro agente.' /* Erro de Execução - Informar na observação para iniciar em outro agente*/
WHEN (T.ResultCode = 10) /* unknow status */
THEN 'Status desconhecido.' /* Em Observação */
WHEN (T.ResultCode = 9) /* paused */
THEN 'Aguardando execução.' /* Aguardando Execução */
WHEN (T.ResultCode = 8) /* halted breakpoint */
THEN 'Breakpoint encontrado.' /* Em Observação */
WHEN (T.ResultCode = 4) /* stopped */
THEN 'Parado manualmente.' /* Erro de Execução */
WHEN (T.ResultCode = 2) /* failed */
THEN 'Erro de execução 1.' /* Erro de Execução */
WHEN (T.ResultCode = 1 AND T.ResultText NOT LIKE '%manually%' AND T.TransactionID != (SELECT TOP 1 A.TransactionID FROM [AutomateEnterprise].[dbo].executionevents (NOLOCK) A WHERE A.TransactionID = T.TransactionID AND A.ResultText LIKE '%Task%' AND A.ResultText LIKE '%failed%' AND A.ResultCode = 2))
THEN 'Executado com sucesso.' /* Sucesso */
WHEN (T.ResultCode = 1 AND T.ResultText NOT LIKE '%manually%' AND T.TransactionID = (SELECT TOP 1 A.TransactionID FROM [AutomateEnterprise].[dbo].executionevents (NOLOCK) A WHERE A.TransactionID = T.TransactionID AND A.ResultText LIKE '%Task%' AND A.ResultText LIKE '%failed%' AND A.ResultText LIKE '%Erro%' AND A.ResultCode = 2))
THEN 'Erro de execução 2.' /* Erro de execução*/
WHEN (T.ResultCode = 1 AND T.ResultText NOT LIKE '%manually%' AND T.ResultText NOT LIKE '%running%' AND T.TransactionID = (SELECT TransactionID FROM (SELECT A.TransactionID, A.ResultText, Row_number() OVER(PARTITION BY A.TransactionID ORDER BY A.EndDateTime DESC) RN FROM [AutomateEnterprise].[dbo].executionevents (NOLOCK) A WHERE A.TransactionID = T.TransactionID) as t WHERE t.RN = 2 AND t.ResultText LIKE '%failed%'))
THEN 'Erro de execução 3.' /* Erro de execução*/
WHEN (T.ResultCode = 1) /* sucesso */
THEN 'Executado com sucesso.' /* Executado com sucesso */
WHEN (T.ResultCode = 0) /* stopped */
THEN 'Erro de execução 4.' /* Erro de Execução */
ELSE CONVERT(VARCHAR, T.ResultCode)
END,
H.DIRETORIO = (SELECT REPLACE ((SELECT TOP 1 CAST(CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, T.EndDateTime), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) AS TIME(0))), ':', ''))
FROM
GrowMonitor_BP.[dbo].TB_HISTORICO_WORKFLOW (NOLOCK) H
INNER JOIN #TEMP T
ON T.ConstructID = H.IDWORKFLOW
AND T.TransactionID = H.TRANSACTIONID
AND T.AGENTES = H.AGENTE_NAME
AND H.FLAG != 1
AND H.FLAG != 3
WHERE
H.FLAG != 1
AND H.FLAG != 3
END
COMMIT TRAN
END
IF OBJECT_ID('TEMPDB..#TEMP') IS NOT NULL DROP TABLE #TEMP
IF OBJECT_ID('TEMPDB..#AGENTES') IS NOT NULL DROP TABLE #AGENTES
Respostas
-
Deleted
- Marcado como Resposta Ana_Miguel segunda-feira, 6 de janeiro de 2020 19:00
Todas as Respostas
-
-
-
-
-
Deleted
- Marcado como Resposta Ana_Miguel segunda-feira, 6 de janeiro de 2020 19:00
-
-
-
Então José, essa tarefa foi dada, porque acredita-se que o Job será mais eficiente para realizar os procedimentos que estão dentro da trigger, porque inicialmente, essa trigger pertencia a uma base de dados diferente e foi removida dessa base de dados, por isso a questão de transformar a trigger em um job.
-
-
-
-