Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lucas Fernando

Problema com Trigger e send_dbmail

Recommended Posts

Pessoal boa dia,
Estou tendo problemas ao utilizar a SP send_dbmail juntamente com uma Trigger que eu criei.

Basicamente a trigger vai servir para avisar determinado usuario atravez de email que foram inseridos novos registros.

O estranho é que a trigger e o envio simples do email estavam funcionando normal.

O problema começou a ocorrer apos eu adicionar a função da SP @query, dessa forma quando vou efetuar o INSERT ele fica executando infinitamente porem não retorna nenhum erro. Já chegou a ficar mais de 1h rodando, sendo que quando envio o email direto (fora da trigger) ele é enviado em 3seg.

Se alguem puder ajudar agradeço.

 

Segue o codigo abaixo:

CREATE TRIGGER SC1_MAIL ON SC1990
 AFTER INSERT 
 AS
   -- variaveis de consulta ao banco
   declare @num varchar(6);
   declare @solict varchar(25);
   
   -- variaveis de envio do email
   Declare @sbody as VarChar(4000);
   
   
   select @num=i.C1_NUM,  
          @solict=i.C1_SOLICIT
   from inserted i;
   
   set @sbody = 'Solic. Num: ' + @num + '   Solicit: ' + @solict;
   
  -- Declare @queryy as nvarChar(max) = 'SELECT C1_PRODUTO, C1_QUANT FROM MP12.dbo.SC1990';
 
   EXEC msdb.dbo.sp_send_dbmail
   @profile_name = 'Perfil Padrao',
   @recipients = 'teste@teste.com.br',
   @subject = 'Numero:',
   @body = @sbody,
   @query = 'SELECT C1_PRODUTO, C1_QUANT FROM MP12.dbo.SC1990;',
   @body_format = 'HTML',
   @attach_query_result_as_file = 1;
   GO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Lucas! tranquilo?

 

Você está fazendo um select em uma tabela que está em processo de atualização, acho que seu select do envio de email está bloqueado pelo insert... tente colocar um with (nolock) no select.

 

Abraço!

Diémerson S. Campos

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Diemerson tudo bem ?

 

Seu conselho me ajudou na realidade eu ja tinha mexido com with a um bom tempo mais praticamente nunca utilizei porque não havia necessidade.

 

após adicionar WITH(NOLOCK) funcionou.

 

No entanto agora fiquei com outra duvida creio que minha trigger ainda necessite de alguns ajustes.

 

Eu posso ter varias linhas adicionadas atravez de um insert, mais na realidade eu gostaria que o email fosse enviado levando em consideração do C1_NUM ou seja se o C1_NUM = 000009 houver 5 linhas (itens 1,2,3,4,5)

ele enviaria apenas um email. No entanto isso eu ainda continuo tendo dificuldade, uma vez que o AFTER INSERT sempre vai levar em consideração o ultimo registro adicionado, dessa forma vai enviar varios emails.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Lucas! Tranquilo?

 

Se as 5 linhas forem inseridas separadamente, você receberá 5 emails... o que você pode fazer é enviar apenas o que foi inserido. isso vai aliviar o consumo de recursos do servidor. Como está atualmente, pra cada insert você faz um select na tabela, isso vai deixar seu insert cada vez mais lento a medida que a tabela cresce. Levante a necessidade da notificação online, talvez colocando um timestamp( talvez uma coluna calculada "alter table tabela add tmstamp as getdate()") na tabela você pode agendar um job rodando a cada hora, 30 min ou tempo acordado, que envia por email os últimos registros inseridos.

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.