Подтвердить что ты не робот

Отправить электронное письмо с триггера

Я пытаюсь создать почтовый триггер. Может ли кто-нибудь помочь в том, как это может быть достигнуто, так что, когда использование вставляет запись, оно проверяет поле "скорость" таким образом, что, когда вставленное значение превышает 100, почта отправляется на указанный адрес.

4b9b3361

Ответ 1

Сначала вам нужно настроить почтовую базу данных - если вы этого еще не сделали, этот вопрос может помочь:

Затем вам нужен триггер:

CREATE TRIGGER dbo.whatever
ON dbo.wherever
FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;

    IF EXISTS (SELECT 1 FROM inserted WHERE speed > 100)
    BEGIN
        EXEC msdb.dbo.sp_send_dbmail
          @recipients = '[email protected]', 
          @profile_name = 'default',
          @subject = 'Someone was speeding', 
          @body = 'Yep, they sure were.';
    END
END
GO

Теперь вы, вероятно, скажете, что хотите, чтобы данные из вставки были действительно включены в сообщение электронной почты. И ваш первый наклон будет состоять в том, чтобы объявить некоторые локальные переменные и назначить их из inserted - это не работает, потому что ваш триггер может реагировать на многострочную вставку. Поэтому правильный способ сделать это:

CREATE TRIGGER dbo.whatever
ON dbo.wherever
FOR INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @body NVARCHAR(MAX) = N'';

    SELECT @body += CHAR(13) + CHAR(10) + RTRIM(some_col) FROM inserted;

    IF EXISTS (SELECT 1 FROM inserted WHERE speed > 100)
    BEGIN
        EXEC msdb.dbo.sp_send_dbmail
          @recipients = '[email protected]', 
          @profile_name = 'default',
          @subject = 'At least one person was speeding', 
          @body = @body;
    END
END
GO

Что все сказано, я не большой поклонник отправки электронной почты с триггера. Несмотря на то, что почта базы данных использует брокер услуг и поэтому является асинхронной, я бы гораздо более склонен заполнять таблицу очередей и иметь фоновый поток, который появляется и отправляет все соответствующие электронные письма. two три приятных вещи об этом:

  • вы минимизируете потенциальные задержки при совершении внешней транзакции, которая запускает триггер - чем сложнее ваша логика в триггере, тем медленнее вы выполняете этот процесс.
  • так как, вероятно, не обязательно, чтобы электронная почта была отправлена ​​в микросекунду, в которую вставлена ​​строка, вы можете легко изменить время фонового процесса - это позволяет не проверять таблицу очень минуту, весь день, когда очень мало раз когда-либо будет на самом деле что-либо делать.
  • Как отметил @goodeye, сохранение этого процесса в отдельности может помешать ошибкам в электронной почте процесса вмешаться в исходный DML (в их случае недопустимый параметр sp_send_dbmail), который я непреднамеренно предложил, предотвратил вставка).