none
Trigger Linha RRS feed

  • Pergunta

  • Bom dia !

      Amigos exite alguma maneira de se criar uma trigger para ser executada apenas quando um campo de uma linha for alterada, pois tenho a seguinte situação precisava disparar um e-mail sempre que uma data na tabela fosse alterada eu ja tenho toda a estrutura do e-mail porem queria que me fosse disparado assim que a data fosse alterada.

      E não posso fazer por coluna pois ela sofre alteração em vários campos então precisava que pega-se o campo especifico.

    segunda-feira, 16 de setembro de 2019 14:57

Respostas

Todas as Respostas

  • Deleted
    segunda-feira, 16 de setembro de 2019 15:47
  • E deu erro não deixa updatar 

    Msg 16915, Level 16, State 1, Procedure Monitora_Fechamento_dia, Line 20
    A cursor with the name 'Le_Linha' already exists.
    The statement has been terminated.

    segunda-feira, 16 de setembro de 2019 16:45
  • Deleted
    segunda-feira, 16 de setembro de 2019 18:39
  • Deu o mesmo erro
    segunda-feira, 16 de setembro de 2019 18:54
  • Deleted
    segunda-feira, 16 de setembro de 2019 18:56
  • Mesmo fechando deu o erro

    CREATE TRIGGER monitora_VALPRM
      on DBO.IBETPRMEMP
      after UPDATE as
      
    begin

    -- encerra processamento se não há linha a processar
    IF not exists (SELECT 1 from INSERTED)
      return;

    -- encerra processamento caso a coluna VALPRM não faça parte do comando UPDATE
    IF not UPDATE (VALPRM)
      return;

    -- analisa linha a linha que tenha sido alterada na coluna VALPRM
    declare @I_CODEMP int, @I_CODPRM int, @D_VALPRM varchar(50), @I_VALPRM varchar(50);
    declare @Houve_caso bit;

    declare Le_Linha cursor
      for SELECT I.CODEMP, I.CODPRM, D.VALPRM as D_VALPRM, I.VALPRM as I_VALPRM
            from INSERTED as I
                 inner join DELETED as D on D.CODEMP = I.CODEMP
                                            and D.CODPRM = I.CODPRM
            where I.CODPRM = 17 
                  and (D.VALPRM <> I.VALPRM
                       or (D.VALPRM is null and I.VALPRM is not null)
                       or (D.VALPRM is not null and I.VALPRM is null));

    set @Houve_caso= 'false';
    OPEN Le_Linha;

    -- lê primeira linha que tenha sido alterada
    FETCH NEXT 
      from Le_Linha
      into @I_CODEMP, @I_CODPRM, @D_VALPRM, @I_VALPRM;

    while @@fetch_status = 0
      begin
      set @Houve_caso= 'true';

      -- monta corpo do e-mail
     DECLARE @tableHTML  NVARCHAR(MAX) ;


    DECLARE @DATA  varchar(50) ;
    DECLARE @DATA1  varchar(50) ;
    DECLARE @assunto  varchar(50) ;
    set  @DATA = CONVERT (char, GETDATE()-3,103) ;
    set  @DATA1 = CONVERT (date, GETDATE()-3);
    set @assunto= 'Fechamento Caixa '+@DATA

    SET @tableHTML =
        N'<font color ="Red"><H1>Extrato Caixa</H1></font>' +
     N'<font color ="Red"><H2>Fechamento dia</H2></font>' +
         N'<font color ="blue">'+@DATA+ '</font>'+
        N'<table border="1">' +
        N'<tr><th>TIPO</th><th>VALOR</th>' +
        
        CAST(
             (SELECT
               TD= C1 ,'',
               TD= C2,''
               from (                      

    SELECT IBETTPOPRSCTA.DESTPOPRSCTA AS c1, Flexx00151700.dbo.func_converter_moeda ( SUM (IBETDTTPRSCTA.VALDTTPRSCTA),'pt-br') AS c2
    FROM Flexx00151700.dbo.IBETDTTPRSCTA IBETDTTPRSCTA (Nolock), 
    Flexx00151700.dbo.IBETTPOPRSCTA IBETTPOPRSCTA (Nolock), 
    Flexx00151700.dbo.IBETVIAVEC IBETVIAVEC (Nolock)
    WHERE IBETTPOPRSCTA.CODEMP = IBETDTTPRSCTA.CODEMP AND 
    IBETTPOPRSCTA.CODTPOPRSCTA = IBETDTTPRSCTA.CODTPOPRSCTA AND
     IBETTPOPRSCTA.TPOPRSCTA = IBETDTTPRSCTA.TPOPRSCTA AND 
     IBETVIAVEC.CODEMP = IBETDTTPRSCTA.CODEMP AND 
     IBETVIAVEC.CODEMP = IBETTPOPRSCTA.CODEMP AND 
     IBETVIAVEC.CODVEC = IBETDTTPRSCTA.CODVEC AND 
     IBETVIAVEC.NUMVIAVEC = IBETDTTPRSCTA.NUMVIAVEC AND 
      CONVERT (date, IBETVIAVEC.DATRTNVIAVEC) = @DATA1 
      and (IBETDTTPRSCTA.TPOPRSCTA<>'D') 
     
    GROUP BY IBETTPOPRSCTA.DESTPOPRSCTA, IBETDTTPRSCTA.TPOPRSCTA
     

    )                              
                     as TD order by 1
                    FOR XML PATH('tr'), TYPE 
             ) AS NVARCHAR(MAX) ) +   N'</table>' ;

      -- lê próxima linha que tenha sido alterada
      FETCH NEXT 
        from Le_Linha
        into @I_CODEMP, @I_CODPRM, @D_VALPRM, @I_VALPRM;
      end;

    CLOSE Le_Linha;
    DEALLOCATE Le_Linha;

    -- enfileira e-mail

    IF @Houve_caso = 'true'
      begin
      
    EXEC msdb.dbo.sp_send_dbmail 
         @profile_name = 'servidor teste',
        @recipients='handersonpais@gmail.com',
        @subject = @assunto,
        @body = @tableHTML,
        @body_format = 'HTML' ;
        
      end;

    end;
    go

    segunda-feira, 16 de setembro de 2019 19:21
  • Deleted
    segunda-feira, 16 de setembro de 2019 19:44
  • O envio do e-mail e para ter informação do faturamento da empresa assim finalizarem o dia no sistema 
    segunda-feira, 16 de setembro de 2019 19:47
  • Deleted
    • Marcado como Resposta HANDERSONPAIS terça-feira, 17 de setembro de 2019 11:32
    segunda-feira, 16 de setembro de 2019 20:05
  • Obrigado meu amigo era isso mesmo que precisava agradeço muito sua atenção.
    terça-feira, 17 de setembro de 2019 11:32
  • Deleted
    terça-feira, 17 de setembro de 2019 11:46