我在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
所以,错误显然与电子邮件有关,也许是安全性?我已经尝试登录服务使用的凭据连接到数据库,如果我手动添加行,它就可以工作。
我也有点担心即使电子邮件没有发送,插入也会失败,为什么会这样?
关于从何处开始排除故障的想法非常受欢迎。
谢谢!
编辑: 从代码中删除了try catch 一般整理
答案 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权限授予您应用程序使用的服务帐户,也可以再次使用上述代码签名。