我想在触发器中发送电子邮件。我正在使用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}}添加到正在访问数据库的用户时,它可以正常工作。)
答案 0 :(得分:1)
我建议不在触发器中执行任何繁重和/或耗时的任务(如发送电子邮件)。
触发器在导致触发的事务的上下文中执行 - 该事务必须等到触发器及其所有操作完成。这是消除系统性能的必然方法。
我宁愿推荐的是:
在你的触发器中,只需在表格中“注意”需要完成的事情(比如发送电子邮件;将所需的所有相关信息存储到该表中) - 然后就是全部触发器
创建一个单独的独立任务(例如,由SQL Server代理运行的预定作业),定期检查“命令”表,然后实际执行所需操作 - 如发送电子邮件,更新大量行,导出数据 - 无论它可能是什么
通过这样的设置,您可以确保您的触发器保持精简和灵活,并且不会导致系统更加减速,而不是绝对必要。