Отправить письмо с триггером, когда я получил письмо, значения были неправильными - PullRequest
0 голосов
/ 19 января 2019

Мой вопрос такой же, как в заголовке вопроса, и ниже приведен код, который я пробовал.

ALTER TRIGGER [dbo].[Entrega_Insert]
ON [dbo].[Entrega]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @DataEntrega DATETIME, @IdEncomenda INT, @QTDEncomenda INT
    DECLARE @IdVisita INT

    SELECT @DataEntrega = DataEntrega, @IdEncomenda = b.IdEncomenda
    FROM [dbo].[Entrega] AS a 
    INNER JOIN [dbo].[Encomenda] AS b ON a.[IdEncomenda] = b.[IdEncomenda]
    INNER JOIN [dbo].[Visita] AS c ON b.[IdVisita] = c.[IdVisita]
    --INNER JOIN 

    DECLARE @BigBody VARCHAR(500) = CAST(@DataEntrega AS VARCHAR(100)) + ' ' + CAST(@IdEncomenda AS VARCHAR(100))

    EXEC msdb.dbo.sp_send_dbmail
            @profile_name = 'Dc'
           ,@recipients = 'danny17kx@gmail.com'
           ,@subject = 'A sua encomenda foi processada e aceite.'
           ,@body = @BigBody
           ,@importance ='HIGH'
           ,@body_format='HTML'
END

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Это слишком долго для комментария.

Я бы настоятельно не рекомендовал вам отправлять электронную почту через триггер. Тот факт, что вы даже не знаете, использовать inserted, говорит о том, что вы недостаточно знакомы с тем, как работает SQL. Вы будете блокировать таблицу (или ее часть) при попытке электронной почты.

Что ты можешь сделать? Самое простое - написать хранимую процедуру для отправки электронной почты и одновременно выполнить вставку. Это дает вам больше контроля над ошибками электронной почты.

Более «профессиональное» решение, вероятно, будет включать очереди сообщений. Вы сделаете вставку, а затем вставите сообщение в очередь. С другой стороны, слушатель отправляет электронное письмо и обрабатывает любые проблемы с ошибками электронной почты.

0 голосов
/ 19 января 2019

Вы получили неправильные значения, потому что ваш запрос нацелен на основную таблицу без какой-либо фильтрации, поэтому вы получите случайные значения из таблицы.

Вместо этого следует использовать таблицу inserted, в которой будут храниться последние вставленные значения.

поэтому ваш запрос должен выглядеть следующим образом:

   SELECT TOP 1 @DataEntrega = DataEntrega, @IdEncomenda=b.IdEncomenda
   FROM inserted AS a 
   INNER JOIN  [dbo].[Encomenda] AS b ON a.[IdEncomenda]= b.[IdEncomenda] 
   INNER JOIN [dbo].[Visita] AS c ON b.[IdVisita] = c.[IdVisita]

Не уверен, что ВНУТРЕННИЕ СОЕДИНЕНИЯ полезны здесь, но если IdEncomenda уже определена в таблице Entrega, то я думаю, что вам будет лучше от этих объединений.

Помните, что ваш метод получит только одну строку, поэтому, если вы вставите несколько строк, вы не получите их все по электронной почте. Поэтому вам нужно использовать другие методы, такие как XML, COALESCE или STUFF, чтобы конкретизировать результаты в @BigBody.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...