none
TRIGGER PARA ENVIAR EMAIL RRS feed

  • Pergunta

  • OLÁ GALERA.

    MONTEI UM SCRIPT PARA QUE TODA VEZ EM QUE O VALOR DE UM DETERMINADO CAMPO FOSSE ALTERADO, O BANCO DE DADOS ATIVASSE A TRIGGER PARA ENVIAR UM EMAIL.

    FIZ UM TESTE E NÃO RECEBI O E-MAIL.

    ALGUÉM PODE ME INFORMAR O QUE ESTÁ ERRADO NO SCRIPT ABAIXO.


    IF EXISTS(SELECT * FROM master.dbo.sysmessages
              WHERE error = 50002)
              
              
             exec SP_DropMessage 50002
    go
    Exec SP_AddMessage 50002,3,'Peça Recebida'
    go


    if exists ( select * from sys.objects where name = 'P_EnviaMensagem')

    drop procedure P_EnviaMensagem

    go

    CREATE PROCEDURE P_EnviaMensagem 

    @Usuario varchar(255) = 'everton@abc.com.br'

    AS

    Exec msdb.dbo.SP_send_dbmail
    @Profile_name = 'T.I Abc',
    @Recipients =  @Usuario',
    @Body = 'Nota fiscal cadastrada ',
    @Subject = 'Produto recebido / conferido',
    @Query

    'select rc_nr as [N° Req Compra],
    CONVERT (char(10),rc_dt,103) as [Dt Requisição],
    r.pd_cd as [Cod. Prod],
    pd_ds as Descricao, 
    rc_qt as Qtde, 
    fun_nmguerra as Solicitante, 
    isnull(r.os_nr,"******") as [N° O.S],
    isnull(tpos_cd,"**") as [Tipo O.S],
    isnull (r.pb_nr,"*******") as [Pedido Balcão],
    r.pc_nr as [N° Pedido Dealer],
    pc_nrmont as [Pedido Fabrica],
    e.nf_lanc as [N.E],
    e.nf_nr as [N° NF],
    Case when e.me_cd like "CO%" then "Compra" 
    when e.me_cd like "TE%" then "Transf."+" - "+ 
    case when e.cg_cd = 4497 then "STS" when e.cg_cd = 5 then "SBC" when e.cg_cd = 4 then "BAR" 
    end
    end as [Tipo de Atendimento],

    CONVERT (char(10),e.nf_dtcad,103) as [Dt Cadastro N.E],
    CONVERT (char(10),e.nf_dtemis,103) as [Dt Emissao],
    CONVERT (char(10),e.nf_dtent,103) as [Dt Entrada],
    receb.nf_qtrecebida as [Qtd Recebida]

     from ead_rc r 
    join ger_pd p on p.pd_cd=r.pd_cd 
    join tab_fun f on f.fun_cd=r.fun_cad
    join ger_nfei i on i.pd_cd=r.pd_cd
    join ger_nfe e on e.nf_lanc=i.nf_lanc and i.pc_nr=r.pc_nr
    join ger_nfec receb on receb.nf_lanc=e.nf_lanc and receb.pd_cd=i.pd_cd
    join ger_cg c on c.cg_cd=e.cg_cd
    join ead_pc pc on pc.pc_nr=r.pc_nr'

    go

    IF EXISTS(SELECT * FROM sys.triggers
              WHERE name = 'T_InformaPecaRecebida')


    drop trigger  dbo.T_InformaPecaRecebida          

    go

    CREATE TRIGGER T_InformaPecaRecebida

    ON ger_nfec

    FOR INSERT

    AS

    DECLARE @nr_req char(7),
    @dt_req datetime,
    @cod_prod char(14),
    @descri_prod varchar (50),
    @qt_prod float,
    @solicitante varchar (20),
    @os_nr char (7),
    @tp_os char(2),
    @ped_blc char(7),
    @nr_ped_dealer char (7),
    @nr_ped_fab char(7) ,
    @nr_ne char (7),
    @nr_nota  char(7),
    @tp_atend varchar (12),
    @dt_cad_ne datetime,
    @dt_Emis datetime,
    @dt_ent datetime,
    @nf_qtrecebida float

            
    select
    @nr_req = rc_nr,
    @dt_req  = rc_dt,
    @cod_prod = r.pd_cd,
    @descri_prod = pd_ds,
    @qt_prod = rc_qt,
    @solicitante = fun_nm,
    @os_nr = r.os_nr,
    @tp_os = tpos_cd,
    @ped_blc = pb_nr,
    @nr_ped_dealer = r.pc_nr,
    @nr_ped_fab = pc_nrmont,
    @nr_ne = receb.nf_lanc,
    @nr_nota  = nf_nr,
    @tp_atend = me_cd,
    @dt_cad_ne  = e.nf_dtcad,
    @dt_Emis = nf_dtemis,
    @dt_ent = nf_dtent,

    @nf_qtrecebida = inserted.nf_qtrecebida

     from ead_rc r 
    join ger_pd p on p.pd_cd=r.pd_cd 
    join tab_fun f on f.fun_cd=r.fun_cad
    join ger_nfei i on i.pd_cd=r.pd_cd
    join ger_nfe e on e.nf_lanc=i.nf_lanc and i.pc_nr=r.pc_nr
    join ger_nfec receb on receb.nf_lanc=e.nf_lanc and receb.pd_cd=i.pd_cd
    join ger_cg c on c.cg_cd=e.cg_cd
    join ead_pc pc on pc.pc_nr=r.pc_nr

    join inserted on receb.nf_qtrecebida=inserted.nf_qtrecebida



    segunda-feira, 27 de abril de 2015 20:31

Respostas

  • Everton,

    Você esta tentando executar o envio do seu Select conectado no MSDB ou no seu banco de dados?

    Na linha do From coloque o NomedoBancodedados.NomedoSchema.NomedaTabela


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Everton.moreira segunda-feira, 25 de maio de 2015 17:12
    sábado, 2 de maio de 2015 01:02

Todas as Respostas

  • Everton,

    Você configurou uma conta de Operador e também o Database Mail?

    O SQL Server Agent esta em execução?

    Um detalhe importante que você deve também analisar relaciona-se ao usuário que esta conectado no banco de dados no momento em que o trigger é disparado, o mesmo deve ter permissão para poder executar a System Stored Procedure SP_Send_Dbmail.


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 28 de abril de 2015 15:44
  • Pedro, sou iniciante nestes processos. Mas vamos lá.

    O Database mail e a conta de operador está configurado e o Agente também está em execução, quando há falhas nos jobs eu recebo um e-mail indicando a falha.

    Eu fiz uns testes

    Executei no banco este script

    Exec msdb.dbo.SP_send_dbmail
    @Profile_name = 'T.I Vetelli',
    @Recipients = 'everton.moreira@vetelli.com.br',
    @Body = 'Teste enviado pelo SQL Server',
    @Subject = 'Mensagem enviada com sucesso'

    Recebi normalmente em meu e-mail este teste.

    Quando tento executo este abaixo:

    Exec msdb.dbo.SP_send_dbmail
    @Profile_name = 'T.I Vetelli',
    @Recipients = 'everton.moreira@vetelli.com.br',
    @Body = 'Nota fiscal cadastrada ',
    @Subject = 'Produto recebido / conferido',
    @Query

    'select rc_nr as [N° Req Compra],
    CONVERT (char(10),rc_dt,103) as [Dt Requisição],
    r.pd_cd as [Cod. Prod],
    pd_ds as Descricao, 
    rc_qt as Qtde, 
    fun_nmguerra as Solicitante, 
    isnull(r.os_nr,"******") as [N° O.S],
    isnull(tpos_cd,"**") as [Tipo O.S],
    isnull (r.pb_nr,"*******") as [Pedido Balcão],
    r.pc_nr as [N° Pedido Dealer],
    pc_nrmont as [Pedido Fabrica],
    e.nf_lanc as [N.E],
    e.nf_nr as [N° NF],
    Case when e.me_cd like "CO%" then "Compra" 
    when e.me_cd like "TE%" then "Transf."+" - "+ 
    case when e.cg_cd = 4497 then "STS" when e.cg_cd = 5 then "SBC" when e.cg_cd = 4 then "BAR" 
    end
    end as [Tipo de Atendimento],

    CONVERT (char(10),e.nf_dtcad,103) as [Dt Cadastro N.E],
    CONVERT (char(10),e.nf_dtemis,103) as [Dt Emissao],
    CONVERT (char(10),e.nf_dtent,103) as [Dt Entrada],
    receb.nf_qtrecebida as [Qtd Recebida]

     from ead_rc r 
    join ger_pd p on p.pd_cd=r.pd_cd 
    join tab_fun f on f.fun_cd=r.fun_cad
    join ger_nfei i on i.pd_cd=r.pd_cd
    join ger_nfe e on e.nf_lanc=i.nf_lanc and i.pc_nr=r.pc_nr
    join ger_nfec receb on receb.nf_lanc=e.nf_lanc and receb.pd_cd=i.pd_cd
    join ger_cg c on c.cg_cd=e.cg_cd
    join ead_pc pc on pc.pc_nr=r.pc_nr'

    DÁ O SEGUINTE ERRO:

    Msg 22050, Level 16, State 1, Line 0
    Error formatting query, probably invalid parameters
    Msg 14661, Level 16, State 1, Procedure sp_send_dbmail, Line 504
    Query execution failed: Mensagem 208, Nível 16, Estado 1, Servidor VETELLI-S01\VETELLI_S01, Linha 1
    Nome de objeto 'ead_rc' inválido.

    O OBJETO QUE INDICA COMO INVÁLIDO (EAD_RC) É UMA TABELA DO MEU BANCO.


    quinta-feira, 30 de abril de 2015 19:39
  • Everton,

    Você esta tentando executar o envio do seu Select conectado no MSDB ou no seu banco de dados?

    Na linha do From coloque o NomedoBancodedados.NomedoSchema.NomedaTabela


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Everton.moreira segunda-feira, 25 de maio de 2015 17:12
    sábado, 2 de maio de 2015 01:02
  • Olá, Pedro.

    Me desculpe a demora em responder, estava de férias.

    Muito obrigado deu certinho.

    segunda-feira, 25 de maio de 2015 17:12