Вопрос по email, triggers, sql-server-2008-r2 – Отправить письмо из триггера

18

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

Вам также нужно предоставить GRANT EXECUTE пользователю msdb.dbo.sp_send_dbmail, если он запущен, например, в приложении. smoore4

Ваш Ответ

1   ответ
48

ли, этот вопрос может помочь:

Scripting setup of database mail

Тогда вам нужен триггер:

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три хорошие вещи об этом:

you minimize the potential delays in committing the outer transaction that fired the trigger - the more complicated your logic in the trigger, the slower you make that process. since it is probably not essential that the e-mail is sent the microsecond the row is inserted, you can easily fluctuate the timing of the background process - this avoids having to check the table very minute, all day, when very few times it will ever have to actually do anything. As @goodeye pointed out, keeping this process separate can prevent errors in the e-mail part of the process from interfering with the original DML (in their case, an invalid parameter to sp_send_dbmail - which I inadvertently suggested - prevented the insert).
Благодарю. Вы решение работает отлично James Obuhuma
+1 для "Да, они точно были."
Спасибо за ответ. Как мне настроить базу данных почты. James Obuhuma
С тех пор, как я это сделал, прошло много лет, но разве это не то, что делает вызов sp_send_dbmail? Это помещает это в очередь, правильно?
@MojoFilter: да, но он сразу же помещается в очередь, и вы не можете управлять механикой в sp_send_dbmail. Я бы предпочел сам контролировать поток почты. Опять предпочтение. Вы хотите отправлять почту внутри триггера, во что бы то ни стало, продолжайте.

Похожие вопросы