0

我在 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,就可以了。添加了新行。

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

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

关于从哪里开始排除故障的想法是最受欢迎的。

谢谢!

编辑:从代码常规 Tidy up 中删除了 try catch

4

1 回答 1

2

触发器在对过程没有 EXECUTE 权限的上下文中执行msdb.dbo.sp_send_dbmail。您很可能陷入了受限EXECUTE AS沙箱,请参阅了解执行上下文。这将与您描述的问题完全一样:它适用于 SSMS,但不适用于您的应用程序。

有关如何使用代码签名为在 EXECUTE AS 上下文沙箱中运行的代码授予执行权限的示例,请参阅从激活的过程调用另一个数据库中的过程。

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

于 2012-06-11T11:24:14.757 回答