在TRIGGER上发送邮件会阻止插入(并且电子邮件不发送)

时间:2012-06-11 11:02:52

标签: sql-server email triggers

我在INSERT上有一个简单的触发器

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
  • 如果我使用Management Studio手动添加一行,一切都很好,已添加行添加的电子邮件。
  • 如果通过该服务记录错误,则不执行任何操作。没有电子邮件,没有新行。
  • 如果我删除触发器 - 事情按预期工作,添加行。
  • 如果我保留了触发器,但删除了电子邮件SP,则可以。添加了新行。

所以,错误显然与电子邮件有关,也许是安全性?我已经尝试登录服务使用的凭据连接到数据库,如果我手动添加行,它就可以工作。

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

关于从何处开始排除故障的想法非常受欢迎。

谢谢!

编辑: 从代码中删除了try catch 一般整理

1 个答案:

答案 0 :(得分:2)

触发器在没有msdb.dbo.sp_send_dbmail过程的EXECUTE权限的上下文中执行。您很可能会陷入受约束的EXECUTE AS沙盒,请参阅Understanding Execution Context。这与您描述问题完全一致:它可以从SSMS运行,但不适用于您的应用程序。

有关如何使用代码签名为在EXECUTE AS上下文沙箱中运行的代码授予执行权限的示例,请参阅Call a procedure in another database from an activated procedure

如果代码没有在EXECUTE下运行,那么这只是一个简单的权限问题。您可以将[{1}}上的[msdb]访问权限和EXECUTE权限授予您应用程序使用的服务帐户,也可以再次使用上述代码签名。