Триггер электронной почты при изменении данных - PullRequest
1 голос
/ 11 мая 2011

Я создал триггер, который отправляет электронное письмо, когда поле Aantal изменяется, но проблема в том, что он не получит удаленные и вставленные данные для размещения в теле письма.И мне сказали, что это потому, что удаленный и вставленный содержит несколько строк.Пожалуйста, предложите решение «получить строку, содержащую измененные данные».

im с использованием SQL Server 2008R2

КОД:

      --DE TRIGGERT--
ALTER TRIGGER [dbo].[RVABestellingenAantalWijzigenTrigger]
ON [dbo].[RVA_Bestellingen]  
AFTER UPDATE
AS
--Vars
DECLARE @body varchar(500)
DECLARE @BestellingID int
DECLARE @CategorieID int
DECLARE @SubCategorieID int
DECLARE @AantalOrigineel int
DECLARE @AantalNieuw int
DECLARE @LocatieNaam varchar(255)
DECLARE @ComponentNaam varchar(255)
DECLARE @CategorieNaam varchar(255)
DECLARE @SubCategorieNaam varchar(255)
DECLARE @Datum datetime

if update(Aantal) /*and (SELECT Datum FROM inserted) = cast(floor(cast(dateadd(day,1,getdate()) as float)) as datetime)  */ and   (convert(varchar,getdate(),108)>'11:00')
begin

    --Zetten aantallen
    SET @AantalOrigineel            = (SELECT Aantal FROM deleted)
    SET @AantalNieuw                = (SELECT Aantal FROM inserted) 
    SET @BestellingID               = (SELECT BestellingID FROM inserted)
    SET @CategorieID                = (SELECT CategorieID FROM inserted)    
    SET @SubCategorieID             = (SELECT SubCategorieID FROM inserted) 

    --Zetten locatienaam en componentnaam
    SELECT @LocatieNaam = ('RVA Aanpassingen Locatie: '+LocatieNaam), @ComponentNaam=OfficieleNaam, @Datum=Datum
    FROM RVA_Bestellingen r
    LEFT OUTER JOIN Locaties l on l.LocatieID = r.LocatieID
    LEFT OUTER JOIN Componenten c on c.ComponentID = r.ComponentID
    WHERE r.BestellingID = @BestellingID    


    SELECT @CategorieNaam = Categorie
    FROM RVA_HoofdCategorie
    WHERE HoofdCategorieID = @CategorieID   

    SELECT @SubCategorieNaam = Categorie
    FROM dbo.RVA_SubCategorie
    WHERE SubCategorieID = @SubCategorieID      

    --Zet boyd
    SET @body = (
                    SELECT 
                        'HoofdCategorie: ' + @CategorieNaam+ char(10)+char(13)
                        +'SubCategorie: ' + @SubCategorieNaam+ char(10)+char(13)
                        + 'Componentnaam: '
                        + @ComponentNaam + char(10)+char(13)
                        + 'Origineel aantal: '
                        + CAST(@AantalOrigineel as varchar(50) ) + char(10)+char(13)
                        + 'Nieuw aantal: '
                        + CAST(@AantalNieuw as varchar(50) ) + char(10)+char(13)
                        + 'Leverdatum: ' +
                        + convert(varchar(50),@Datum,105)                       
                )

    --Mailen naar Adeline
     EXEC master..xp_sendmail 
            @recipients = 'test@test.nl', 
            @message    = @body, 
            @subject    = @LocatieNaam
end

Ответы [ 2 ]

4 голосов
/ 11 мая 2011

Вы понимаете, что запускает огонь на партию, а не на ряд, верно? Это вообще плохая идея. сбросьте данные в другую таблицу, напишите задание, которое каждую минуту проверяет эту таблицу и отправляет электронное письмо

Вы хотите, чтобы триггер был максимально быстрым и не отправлял электронные письма

См. Также: Рекомендация: кодирование триггеров SQL Server для многострочных операций

Другой вариант (, который также является плохой идеей ) - это циклическое удаление удаленных и вставленных таблиц в триггере и отправка электронного письма для каждой строки

вы также должны использовать sp_send_dbmail, а не xp_sendmail, поскольку вы находитесь в 2008 году, xp_sendmail устарела

Так же, как к вашему сведению

как то так

SET @BestellingID               = (SELECT BestellingID FROM inserted)
SET @CategorieID                = (SELECT CategorieID FROM inserted)    
SET @SubCategorieID             = (SELECT SubCategorieID FROM inserted)

может быть сделано с 1 выбором

  SELECT    @BestellingID = BestellingID,
        @CategorieID = CategorieID,
        @SubCategorieID = SubCategorieID 
FROM inserted

Нет необходимости выполнять 3 запроса ... это вам не поможет, так как вам нужно кодировать несколько строк, а просто показать, что вы можете назначить несколько переменных с помощью 1 выбора

0 голосов
/ 11 мая 2011

Нет способа получить только измененные данные , как вы просите, так как вы можете изменить несколько строк.

Например, если вы выполните следующее:

UPDATE MyTable
SET Col2 = Col2 + 1

В каждом ряду Col2 увеличивается на единицу. Какой ряд вы хотели бы для вашего примера?

Вы можете использовать предложение TOP 1 в своих выборках, которое присваивает значения переменным вверху, но единственный способ сделать то, что вы хотите, это использовать цикл WHILE или курсор для отправки электронного письма на строка, которая потенциально будет МНОГО писем.

Также это довольно плохая практика в целом, так как все ваши транзакции будут задерживаться на этой процедуре электронной почты, чтобы запускаться при каждом обновлении / удалении / вставке.

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