Sql server 在SQL Server中发送电子邮件的触发器

Sql server 在SQL Server中发送电子邮件的触发器,sql-server,tsql,Sql Server,Tsql,我想用触发器发送电子邮件。我正在使用msdb.dbo.sp\u send\u dbmail来实现这一点。我无法正确设置权限 我不想将msdb的DatabaseMailUserRole添加到具有数据访问权限的数据库用户 因此,我创建了另一个用户mailer,他拥有DatabaseMailUserRole 触发器定义为: CREATE TRIGGER MyTrigger ON MyTable WITH EXECUTE AS 'mailer' AFTER INSERT AS B

我想用触发器发送电子邮件。我正在使用
msdb.dbo.sp\u send\u dbmail
来实现这一点。我无法正确设置权限

我不想将
msdb
DatabaseMailUserRole
添加到具有数据访问权限的数据库用户

因此,我创建了另一个用户
mailer
,他拥有
DatabaseMailUserRole

触发器定义为:

CREATE TRIGGER MyTrigger
    ON MyTable
    WITH EXECUTE AS 'mailer'
    AFTER INSERT
AS
BEGIN
  exec msdb.dbo.sp_send_dbmail ...
END
我得到以下错误:

对对象“sp_send_dbmail”、数据库“msdb”、架构“dbo”的执行权限被拒绝

(当我用EXECUTE AS'mailer'删除
并向访问数据库的用户添加
DatabaseMailUserRole
时,它工作正常。)

我建议不要在触发器中执行任何繁重和/或耗时的任务(如发送电子邮件)

触发器在触发它的事务的上下文中执行,而该事务必须等待触发器及其所有操作完成。这是消除系统中任何性能的可靠方法

我想推荐的是:

  • 在触发器内部,只需在表中记下需要做的事情(如发送电子邮件;将所需的所有相关信息存储到该表中),然后触发器就完成了所有操作

  • 创建一个单独的、独立的任务(例如,由SQL Server代理运行的计划作业),定期检查“命令”表,然后实际执行所需的操作,如发送电子邮件、更新大量行、导出数据,不管它是什么


通过这样的设置,您可以确保触发器保持精简和灵活,不会对系统造成比绝对必要的更大的减速。

可能的副本是发送电子邮件的重载操作?我认为电子邮件只是排队而不是直接发送。只有在检测到严重错误时,我才会发送电子邮件。@TN:如果SMTP传输出现问题,发送电子邮件可能需要很长时间-有一些超时,在事务中增加30或60秒不是一个好主意!您认为
msdb.dbo.sp\u send\u dbmail
会等待SMTP传输完成吗?我以为电子邮件只是排队等待发送,
msdb.dbo.sp_send_dbmail
不会等到电子邮件发送。