locked
Trigger para disparar envio de e-mail usando sp_send_dbmail com o corpo do e-mail personalizado RRS feed

  • Pergunta

  • Olá pessoal!, Sou iniciante no MSSQL Server 2005 e estou fazendo uma trigger para enviar um e-mail de notificação após a inserção de um registro em uma tabela específica(sql abaixo). No entanto esse e-mail só sera enviado se o código do movimento(codtmv) for igual a 1.1.01, teste que esta funcionando corretamente. Não estou conseguindo colocar no corpo do e-mail alguns dados desse registro inserido na tabela, gostaria de estar colocando os campos numeromov e datacriacao dessa tabela tmov. Alguma idéia?
    Desde já agradeço a ajuda.

    CREATE TRIGGER [envia_email]
    ON [teste].[dbo].[tmov]
    AFTER INSERT, UPDATE
    AS
    begin
        DECLARE @tipoMov VARCHAR(10)
        select @tipoMov = (select codtmv from inserted)
        if @tipoMov = '1.1.01'
            EXEC msdb.dbo.sp_send_dbmail
                @profile_name = 'Compras',
                @recipients = 'XXXXXX@gmail.com;XXXXXX@bol.com.br',
                @body = 'Teste de E-mail ',
                --@query =
                @subject = 'Notificação de Solicitação de Compra',
                --@attach_query_result_as_file = 0;
    end
    quinta-feira, 12 de junho de 2008 17:43

Respostas

  • Olá,

     

    Eu desconhecia esse tipo de limitação. Quer dizer que a trigger abaixo não funciona ?

     

    Code Snippet

    CREATE TRIGGER [envia_email]

    ON [teste].[dbo].[tmov]

    AFTER INSERT, UPDATE

    AS

    begin

    DECLARE @tipoMov VARCHAR(10), @NumeroMov INT, @DataCriacao DATETIME

    SELECT

    @tipoMov = codtmv, @NumeroMov = NumeroMov, @DataCriacao = DataCriacao

    FROM INSERTED

     

    DECLARE @varbody VARCHAR(100)

    SET @varbody = 'O conteúdo do e-mail é: ' + CHAR(10) +

    'A variável @tipoMov é: ' + @tipoMov + CHAR(10) +

    'A variável @NumeroMov é: ' + CAST(@NumeroMov AS VARCHAR(4)) + CHAR(10) +

    'A variável @DataCriacao é: ' + CONVERT(CHAR(10),@DataCriacao,103)

     

    if @tipoMov = '1.1.01'

    EXEC msdb.dbo.sp_send_dbmail

    @profile_name = 'Compras',

    @recipients = 'XXXXXX@gmail.com;XXXXXX@bol.com.br',

    @body = @varbody,

    --@query =

    @subject = 'Notificação de Solicitação de Compra'

    --@attach_query_result_as_file = 0;

    end

     

     

    [ ]s,

     

    Gustavo

    quinta-feira, 12 de junho de 2008 20:55

Todas as Respostas

  • Olá DWAraujo,

     

    Primeiramente tente procurar outra solução se possível para o envio de e-mails. Idealmente falando, o envio de e-mails deve ser destinado a jobs e rotinas administrativas do SQL Server. Não deveríamos desperdiçar recursos de banco de dados para realizar tarefas tão inexpressivas como o envio de e-mail. Certamente é bem melhor se o banco responder uma consulta mais rapidamente do que gastar recursos para enviar um e-mail.

     

    Para conseguir enviar os campos NumeroMov e DataCriacao, você teria que capturá-los. Ex:

     

    Code Snippet

    DECLARE @NumeroMov INT, @DataCriacao DATETIME

    SELECT @NumeroMov = NumeroMov, @DataCriacao = DataCriacao FROM INSERTED

     

    É possível aproveitar até a mesma atribuição anterior. Ex:

     

    Code Snippet

    DECLARE @tipoMov VARCHAR(10), @NumeroMov INT, @DataCriacao DATETIME

    SELECT @tipoMov = codtmv, @NumeroMov = NumeroMov, @DataCriacao = DataCriacao FROM INSERTED

     

    [ ]s,

     

    Gustavo

    quinta-feira, 12 de junho de 2008 19:49
  • Olá Gustavo! Agradeço a ajuda! Realizei o teste da captura dos campos e funcionou certinho, o problema que não consiguo utilizar essas variáveis dentro da procedure sp_send_dbmail, pois quando a mesma é executada ela inicia uma nova transanção e não tem acesso a essas variáveis, teria outra idéia de como poderia realizar essa captura para utilizar na procedure sp_send_dbmail?
    quinta-feira, 12 de junho de 2008 20:41
  • Olá,

     

    Eu desconhecia esse tipo de limitação. Quer dizer que a trigger abaixo não funciona ?

     

    Code Snippet

    CREATE TRIGGER [envia_email]

    ON [teste].[dbo].[tmov]

    AFTER INSERT, UPDATE

    AS

    begin

    DECLARE @tipoMov VARCHAR(10), @NumeroMov INT, @DataCriacao DATETIME

    SELECT

    @tipoMov = codtmv, @NumeroMov = NumeroMov, @DataCriacao = DataCriacao

    FROM INSERTED

     

    DECLARE @varbody VARCHAR(100)

    SET @varbody = 'O conteúdo do e-mail é: ' + CHAR(10) +

    'A variável @tipoMov é: ' + @tipoMov + CHAR(10) +

    'A variável @NumeroMov é: ' + CAST(@NumeroMov AS VARCHAR(4)) + CHAR(10) +

    'A variável @DataCriacao é: ' + CONVERT(CHAR(10),@DataCriacao,103)

     

    if @tipoMov = '1.1.01'

    EXEC msdb.dbo.sp_send_dbmail

    @profile_name = 'Compras',

    @recipients = 'XXXXXX@gmail.com;XXXXXX@bol.com.br',

    @body = @varbody,

    --@query =

    @subject = 'Notificação de Solicitação de Compra'

    --@attach_query_result_as_file = 0;

    end

     

     

    [ ]s,

     

    Gustavo

    quinta-feira, 12 de junho de 2008 20:55
  • Gustavo, testei o código acima e funcionou sim, a informação que tinha estava incorreta... Valew !!!

     

    sexta-feira, 13 de junho de 2008 13:46