2015-12-03 6 views
-3

Я пытаюсь создать триггер, который отправляет электронное письмо ТОЛЬКО, когда есть вставка. В настоящее время я получаю электронное письмо, есть ли вставка или нет, и я ХОЧУ получить электронную почту ТОЛЬКО, когда в таблице есть вставка. Вот как триггер в настоящее время выглядитВставить только триггер в SQL Server

ALTER TRIGGER [dbo].[myTriggerName] 
ON [dbo].[myTableName] 
AFTER INSERT 
AS 
BEGIN 

    EXEC msdb.dbo.sp_send_dbmail 
     @recipients = 'MyRecipients', 
     @profile_name = 'DBAdmins', 
     @subject = 'MySubject', 
     @body = 'Body'; 


END 
+1

Покажите нам, что у вас сделанный. Пожалуйста, прочитайте [** Как спросить **] (http://stackoverflow.com/help/how-to-ask) \t \t \t \t \t И [** Как создать минимальный, полный и проверенный пример. **] (http://stackoverflow.com/help/mcve) –

+0

Какова проблема, с которой вы столкнулись при попытке создать такой триггер? –

+0

Просьба указать код функции запуска. –

ответ

1
CREATE TRIGGER dbo.trg_I_tbl 
    ON dbo.tbl 
    AFTER INSERT 
AS 
BEGIN 

    SET NOCOUNT ON; 

    DECLARE @text NVARCHAR(MAX) 

    SELECT @text = STUFF((
     SELECT ', ' + col 
     FROM INSERTED 
     FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') 

    EXEC msdb.dbo.sp_send_dbmail 
     @recipients = '[email protected]', 
     @subject = 'caption', 
     @body = @text 

END 
GO 
+5

Я был бы очень осторожен, чтобы провести обширную обработку или что-то вроде отправки электронной почты непосредственно в триггер. Триггер выполняется в контексте вызывающей транзакции и, таким образом, задерживает завершение этой транзакции до тех пор, пока не будет выполнен триггер. Если у вас есть внешние зависимости, вы можете быстро попасть в ситуации, когда у вас есть тайм-ауты и т. Д. Триггер должен быть чрезвычайно проворным и небольшим ** - сделать заметку в отдельной таблице «EmailToSend» и иметь отдельный процесс (запланированный на ежеквартально), проверяя эту таблицу и отправляя электронные письма –

3

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

Триггер запускается в контексте вызывающей транзакции и, таким образом, задерживает завершение этой транзакции до ее завершения.

Если у вас есть внешние зависимости (например, сервер SMTP), вы можете быстро попасть в ситуацию, когда у вас есть время ожидания и т.д.

Триггер должен быть чрезвычайно проворным, маленьким и быстрым.

Моя рекомендация будет:

  • сделать отметку в отдельную таблицу EmailToSend всю необходимую информацию, вам нужно (получатель, тема, тело, дата хранится)

    CREATE TRIGGER trgYourTableInsert 
    ON dbo.YourTable 
    AFTER INSERT 
    AS 
        INSERT INTO dbo.EmailToSend(Recipient, Subject, Body) 
        VALUES('[email protected]', 'Hello there', '.......') 
    
  • есть отдельный процесс (например, запланированная хранимая процедура, которая выполняется один раз в час), проверяя эту таблицу и выполняющую фактическую отправку электронных сообщений (без блокировки любых других процессов/транзакций) - что-то вроде строк:

    SELECT (list of columns) 
    FROM dbo.EmailToSend 
    WHERE DateSent IS NULL 
    

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

+0

Пожалуйста, можете ли вы выполнить скриптовую процедуру, которая будет проверять таблицу EmailToSend? благодаря – TJL

Смежные вопросы