Sql server 在触发器上发送邮件会停止插入(并且电子邮件不会发送)

Sql server 在触发器上发送邮件会停止插入(并且电子邮件不会发送),sql-server,email,triggers,Sql Server,Email,Triggers,我有一个简单的插入触发器 ALTER TRIGGER [dbo].[SendErrorEmail] ON [dbo].[tblNewErrorLog] FOR INSERT AS BEGIN EXEC msdb.dbo.sp_send_dbmail @profile_name='myprofile', @recipients='me@me.com', @subject='error in the database

我有一个简单的插入触发器

ALTER TRIGGER [dbo].[SendErrorEmail]
   ON  [dbo].[tblNewErrorLog]
   FOR INSERT
AS 
BEGIN   


    EXEC msdb.dbo.sp_send_dbmail 
        @profile_name='myprofile',
        @recipients='me@me.com',
        @subject='error in the database',
        @body = 'check it out'

END
  • 如果我使用ManagementStudio手动添加行,一切正常,行添加电子邮件已发送
  • 如果通过该服务记录了错误,则不会显示任何内容。没有电子邮件,没有新行
  • “如果我移除触发器,事情会按预期进行,”行补充道
  • 如果我保留触发器,但删除电子邮件SP,就可以了。新增一行
那么,这个错误显然与电子邮件有关,也许是安全问题?我已经尝试使用服务连接到数据库所使用的凭据登录数据库,如果我手动添加一行,它就会工作

我也有点担心,即使电子邮件没有发送,插入也会失败,这是为什么

非常欢迎您考虑从何处开始进行故障排除

谢谢

编辑: 已从代码中删除try-catch
常规整理

触发器在对
msdb.dbo.sp\u send\u dbmail
过程没有执行权限的上下文中执行。您很可能陷入了受约束的
executeas
sandboxing,请参阅。这与您描述的问题完全一样:它可以从SSM工作,但不能在您的应用程序中工作

有关如何使用代码签名向在execute AS context沙盒中运行的代码授予执行权限的示例,请参见


如果代码没有在executeas下运行,那么这只是一个简单的权限问题。您可以向应用程序使用的服务帐户授予[msdb]对
sp_send_dbmail
的访问权限和执行权限,也可以像上面一样再次使用代码签名。

您不应该将发送电子邮件的失败与触发器相耦合。相反,可以向相关表中添加一个标志列,并运行一个单独的进程,为未标记的行发送电子邮件,或者使用队列表。发送电子邮件时可能会出现很多问题,您不希望将记录错误的成功率与这些问题联系在一起。无论发生什么错误,都会被BEGIN CATCH、END CATCH、remove CATCH或在异常处理中添加其他错误记录吞噬抱歉,try-catch是我的副本,粘贴我的故障排除尝试,如果我完全删除try-catch,同样的事情也会发生。我想看看,如果捕获成功,行是否仍会被插入hit@LasseV.Karlsen:
sp_send_dbmail
已将触发器与任何SMTP活动解耦。它使用内部SQL Server队列(Service Broker),SMTP活动由外部进程处理。感谢您的快速回复。我为相关用户在sp_send_dbmail中添加了exec权限,一切正常。我不喜欢插入失败的事实。我猜这是出于设计,如果链接到某个操作的触发器失败,那么所有操作都会失败?默认情况下,触发器都是使用。