none
Fazer uma TRIGGER virar um JOB RRS feed

  • 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

    segunda-feira, 6 de janeiro de 2020 17:39

Respostas

  • José, estou com o meu agendador de tarefas aberto. Como funcionaria essa solução de contorno utilizando o agendador? 

    No Agendador de Tarefas os jobs têm extensão bat, de processamento batch, e o job é então rodado no shell do MS-DOS (também é possível criar jobs para rodar no powershell).  Você precisa também criar um arquivo com a extensão .sql contendo o código SQL a ser executado no job.

    Sugestão de leitura: How To Schedule SQL Scripts On SQL Server Express Edition 


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 6 de janeiro de 2020 18:51
    • Marcado como Resposta Ana_Miguel segunda-feira, 6 de janeiro de 2020 19:00
    segunda-feira, 6 de janeiro de 2020 18:50

Todas as Respostas

  • (...) 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).

    Ana Miguel, qual é a edição do SQL Server?

    Se for edição Express, o Agent é iniciado mas fica inativo. Nestes casos, o que se faz é utilizar o Agendador de Tarefas do Windows. Você pode confirmar qual é a edição do SQL Server 2017 que está a utilizar?

    -- código #1
    PRINT @@version;
     


    José Diz     Belo Horizonte, MG - Brasil     [  Novos recursos de programação para SQL Server ]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 6 de janeiro de 2020 20:18
    segunda-feira, 6 de janeiro de 2020 18:22
  • José, o seu comando me retornou o seguinte resultado:

    segunda-feira, 6 de janeiro de 2020 18:25
  • Ok, Ana.

    Está a utilizar a edição Express do SQL Server 2008 R2, 32 bits, em computador com Windows 8 ou Windows Server 2012.

    A edição Express é gratuita mas possui várias limitações, se comparadas com as demais edições, e uma das limitações é justamente nao poder utilizar o SQL Server Agent. Então, como citei anteriomente, pode-se utilizar o Agendador de Tarefas do Windows como solução de contorno.


    José Diz     Belo Horizonte, MG - Brasil     [  Novos recursos de programação para SQL Server ]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 6 de janeiro de 2020 20:18
    segunda-feira, 6 de janeiro de 2020 18:39
  • José, estou com o meu agendador de tarefas aberto. Como funcionaria essa solução de contorno utilizando o agendador? 
    segunda-feira, 6 de janeiro de 2020 18:41
  • José, estou com o meu agendador de tarefas aberto. Como funcionaria essa solução de contorno utilizando o agendador? 

    No Agendador de Tarefas os jobs têm extensão bat, de processamento batch, e o job é então rodado no shell do MS-DOS (também é possível criar jobs para rodar no powershell).  Você precisa também criar um arquivo com a extensão .sql contendo o código SQL a ser executado no job.

    Sugestão de leitura: How To Schedule SQL Scripts On SQL Server Express Edition 


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 6 de janeiro de 2020 18:51
    • Marcado como Resposta Ana_Miguel segunda-feira, 6 de janeiro de 2020 19:00
    segunda-feira, 6 de janeiro de 2020 18:50
  • (...) Existe algum script que eu possa utilizar para transformar a trigger abaixo em um job, ou seja, criar o Job manualmente?

    Não é possível transformar procedimento de gatilho em job, pois as tabelas INSERTED e DELETED somente têm existência dentro do procedimento de gatilho. Qual é o objetivo ao tentar transformar o procedimento de gatilho em job?


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.


    • Editado José Diz segunda-feira, 6 de janeiro de 2020 19:00
    segunda-feira, 6 de janeiro de 2020 18:58
  • Vou tentar utilizar esse recurso José, obrigada. Mas em questão da versão do sql que não permite eu utilizar o agent, se eu atualizar a minha versão do sql, consigo fazer uso desse recurso?
    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.
    segunda-feira, 6 de janeiro de 2020 19:06
  • Vou tentar utilizar esse recurso José, obrigada. Mas em questão da versão do sql que não permite eu utilizar o agent, se eu atualizar a minha versão do sql, consigo fazer uso desse recurso?

    O software SQL Server é disponibilizado por versão, idioma e edição.  As versões são identificadas pelo ano de lançamento, como 2019, 2017, 2016, 2014 etc. Para cada versão as edições podem variar, mas geralmente existem as edições Enterprise, Standard, Developer e Express, além de algumas adicionais que variam de acordo com a versão.

    A edição Enterprise é a mais completa, vindo a seguir a edição Standard, que contém menos recursos e possui limitações de processadores e memória. Para utilizar as edições Enterprise e Standard é necessário adquirir licença. Há também a edição Express, que é gratuita mas possui muitas limitações; indicada somente para bancos de dados com pouco movimento. Para desenvolvedores existe a edição Developer, que é gratuita e possui os mesmos recursos que a edição Enterprise. Para fins de testes é possível utilizar a edição Enterprise por 180 dias, de forma gratuita.



    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 6 de janeiro de 2020 19:10
    segunda-feira, 6 de janeiro de 2020 19:08
  • 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.

    Normalmente não é possível fazer diretamente essa transformação, por causa da existência efêmera das tabelas virtuais INSERTED e DELETED. Entretanto, no código SQL do procedimento de gatilho que você postou em momento algum o conteúdo dessas duas tabelas virtuais é utilizado; ou seja, ao ocorrer evento de inclusão de linha na tabela TB_HISTORICO_WORKFLOW um processo é executado mas sem utilizar as tabelas virtuais. Considerando-se esse fato, me parece que é possível transferir todo o processamento para um job, desde que se encontre um evento que dispare o job.

     


    José Diz     Belo Horizonte, MG - Brasil     [  Novos recursos de programação para SQL Server ]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 6 de janeiro de 2020 21:08
    segunda-feira, 6 de janeiro de 2020 19:18
  • José, então no caso, eu posso "reutilizar" o código dessa trigger na criação do job e fazer o agendamento de quando eu desejo que esse job seja executado?
    segunda-feira, 6 de janeiro de 2020 19:32
  • José, então no caso, eu posso "reutilizar" o código dessa trigger na criação do job e fazer o agendamento de quando eu desejo que esse job seja executado?

    Você pode transformar o procedimento de gatilho (trigger) em um procedimento (stored procedure) e chamar esse procedimento de dentro do job. Falta saber qual será o evento que irá disparar o job.

    Partindo do princípio que o o código SQL está correto, para a transformação substitua

    ALTER TRIGGER [dbo].[ATUALIZA_TB_HISTORICO]
    ON [dbo].[TB_HISTORICO_WORKFLOW]
    AFTER INSERT
    AS
    ...
     

    por

    CREATE PROCEDURE nome_procedure
    as
    ...


    Consulte CREATE PROCEDURE para saber as opções disponíveis para esse comando.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz segunda-feira, 6 de janeiro de 2020 23:33
    segunda-feira, 6 de janeiro de 2020 21:45