Ответ 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
), который я непреднамеренно предложил, предотвратил вставка).