Я пытаюсь создать почтовый триггер. Может ли кто-нибудь помочь в том, как это может быть достигнуто, так что, когда использование вставляет запись, оно проверяет поле "скорость" таким образом, что, когда вставленное значение превышает 100, почта отправляется на указанный адрес.
Отправить электронное письмо с триггера
Ответ 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
), который я непреднамеренно предложил, предотвратил вставка).