2016-12-17 4 views
0

Я использую SQL Server 2014Как отправить электронное письмо нескольким получателям при вставке новой строки?

У меня есть таблица A с этими столбцами:

planNo, parcelNo, id 

И еще один стол B с этими столбцами:

planNo, parcelNo, userEmail 

Когда вставляется новая строка в таблицу A, я хочу отправить электронное письмо на адрес userEmail для всех строк в таблице B, которая имеет то же самое parcelNo и planNo

+0

Это может быть сделано с помощью триггера вставки, которая выполняет sp_send_dbmail (https://msdn.microsoft.com/en-us/library/ms190307.aspx) в цикле для каждого получателя. Если список получателей велик, было бы лучше отправить асинхронные письма из обработчика Service Broker, активированного сообщением, отправленным с помощью триггера. –

ответ

2

Это слишком длинный комментарий.

Вы знаете ответ, потому что вы отметили вопрос «триггер». Вы просите других людей написать свой код для вас, когда вы даже не пытались написать его? Вы должны попробовать себя.

На мой взгляд, отправка электронной почты через триггеры опасна. Я предпочитаю подход на основе API, который использует хранимые процедуры. Ошибки в триггерах могут привести к блокировке базы данных.

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

create procedure usp_InsertAndEmail (
    @planNo ??, 
    @parcelNo ??, 
    @id 
) as 
begin 
    declare @email varchar(255); 

    insert into a(planNo, parcelNo, id) 
     values (@planNo, @parcelNo, @id); 

    declare cursor b_cursor for 
     select email 
     from table b 
     where b.planNo = @planNo and b.parcelNo = @parcelNo; 

    open cursor b_cursor; 

    fetch next from b_cursor into @email; 

    while (@@fetch_status = 0) 
    begin 
     -- do email send however you do it 
     fetch next from b_cursor into @email; 
    end; 
    close b_cursor; 
    deallocate b_cursor; 
end; 

Этот подход также позволяет проверить наличие ошибок при отправке по электронной почте.

+1

Боковое примечание: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+1

@marc_s. , , Конечно, вы абсолютно правы. Я часто префикс хранимых процедур с помощью 'usp_' (поэтому использование' sp_' просто не было достаточно сложным). Я делаю это, даже если я не префикс имен столбцов или имен таблиц или имен схем или имен баз данных, поэтому мне интересно, почему я иногда использую префикс. –

+0

Первое спасибо, но работает ли это даже при импорте в таблицу с использованием файла Excel или любого источника данных? – Zizoo

0

Я полагаю, вы используете PHP?

$requete= 'SELECT * FROM B WHERE planNo=\'.$plannumber.\' AND parcelNo=\'.$parcelnumber.\''; 
$result = $bdd->query($requete); 
    if($result) 
       { 
        while ($donnees = $result->fetch()) 
        { 
         $email=$donnees['userEmail']; 
         $header='From: Name Surname <your_email>'."\r\n"; 
         $title='title of your mail'; 
         $message='your message'; 
         mail($email, $title, $message, $header); 
        } 
       } 
Смежные вопросы