仅在SQL Server中插入触发器

时间:2015-12-03 14:54:43

标签: sql sql-server triggers

我正在尝试创建一个触发器,只有在插入时才会发送电子邮件。我目前收到一封电子邮件,无论是否插入,我只想在表格中插入时才收到电子邮件。以下是触发器当前的样子

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  

2 个答案:

答案 0 :(得分:3)

我会非常小心地进行大量处理或直接将电子邮件发送到触发器中。

触发器在调用事务的上下文中执行,从而延迟该事务的完成,直到完成为止。

如果您有外部依赖项(如SMTP服务器),您可以快速进入超时等情况。

触发器应该非常灵活,小而快。

我的建议是:

  • 在单独的表EmailToSend中记下您需要的所有必要信息(收件人,主题,正文,日期)

    CREATE TRIGGER trgYourTableInsert
    ON dbo.YourTable
    AFTER INSERT
    AS 
       INSERT INTO dbo.EmailToSend(Recipient, Subject, Body)
       VALUES('john.doe@acme.org', 'Hello there', '.......')
    
  • 有一个单独的进程(例如,每小时运行一次的计划存储过程)检查该表并进行实际发送电子邮件(不阻止任何其他进程/事务) - :

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

    或类似的东西 - 它真的在很大程度上取决于你将完全放入该表中以及你想如何处理这个......

答案 1 :(得分: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 = 'your_account@gmail.com',
        @subject = 'caption',
        @body = @text

END
GO