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

时间:2016-05-04 15:12:00

标签: sql-server tsql

我想在触发器中发送电子邮件。我正在使用msdb.dbo.sp_send_dbmail。我有问题如何正确设置权限。

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

因此,我创建了另一位拥有DatabaseMailUserRole的用户CREATE TRIGGER MyTrigger ON MyTable WITH EXECUTE AS 'mailer' AFTER INSERT AS BEGIN exec msdb.dbo.sp_send_dbmail ... END

触发器定义是:

WITH EXECUTE AS 'mailer'

我收到以下错误:

  

对象' sp_send_dbmail',数据库' msdb',架构' dbo'上的EXECUTE权限被拒绝。

(当我删除DatabaseMailUserRole并将{{1}}添加到正在访问数据库的用户时,它可以正常工作。)

1 个答案:

答案 0 :(得分:1)

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

触发器在导致触发的事务的上下文中执行 - 该事务必须等到触发器及其所有操作完成。这是消除系统性能的必然方法。

我宁愿推荐的是:

  • 在你的触发器中,只需在表格中“注意”需要完成的事情(比如发送电子邮件;将所需的所有相关信息存储到该表中) - 然后就是全部触发器

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

通过这样的设置,您可以确保您的触发器保持精简和灵活,并且不会导致系统更加减速,而不是绝对必要。