问题:我无法从SSISDB对象的触发器执行sp_send_mail
。
背景:我们使用部署到SQL Server目录的SSIS,并试图在SSISDB的[internal].[projects]
表上放置触发器,以便在部署时通过电子邮件进行管理。我们不使用Team Foundation服务,因为我们不想因SSIS的有限使用而引起窃听,所以我们正在尝试想出创造性的方法来解决它。
我们已经配置了数据库邮件,并且工作时没有任何问题,除非我们实际尝试触发触发器的部署。
我们得到的错误是:
部署项目失败。请解决问题,稍后再试。:当前事务无法提交,并且无法支持写入日志文件的操作。回滚交易。
对对象"sp_send_dbmail"、数据库"msdb"、架构"dbo"的EXECUTE权限被拒绝。
经过详尽的研究,我发现用户帐户被执行为"S-1-9-3-130423068-130423068-130423068-30423068"(id已更改,但你已经明白了)。我已经将系统中我能看到的所有可能的用户分配给DatabaseMailUserRole
,这样他们就可以发电子邮件了,但我一直遇到的是上面或下面的错误:
部署项目失败。请解决问题,稍后再试。:当前事务无法提交,并且无法支持写入日志文件的操作。回滚交易。
服务器主体"1-9-3-130423068-130423068-130423068-130423068."在当前安全上下文下无法访问数据库"。
我最近了解到,这是一个没有登录名的用户。有人对我们如何处理这件事有什么建议吗?我在谷歌上读到一些关于堆栈溢出和其他地方的文章,我们应该为该SID创建一个登录名,以便能够分配权限。如有任何帮助,我们将不胜感激!
正在执行的触发器
CREATE TRIGGER [internal].[package_deploy]
ON [internal].[projects]
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @body NVARCHAR(MAX) = N'';
DECLARE @subject NVARCHAR(100) = N'';
DECLARE @recipients NVARCHAR(100) = '';
DECLARE @profile_name NVARCHAR(100) = '';
DECLARE @rc INTEGER = 0;
SELECT @body += CHAR(13) + CHAR(10) + name + ' Project was deployed on: ' + CAST(last_deployed_time AS NVARCHAR(MAX))
+ CHAR(13) + CHAR(10) + ' for ticket(s): ' + description
FROM inserted;
SELECT @subject = name + ' Project Deployment Notification' FROM inserted;
SELECT @recipients = @recipients
SELECT @profile_name = @profile_name
IF EXISTS (SELECT 1 FROM inserted)
BEGIN
EXEC msdb.dbo.sp_send_dbmail
@recipients = @recipients,
@profile_name = @profile_name,
@subject = @subject,
@body = @body;
END
END
GO
我会尝试一些更简单的方法。
计划B.看看是否可以让触发器在数据库/表中插入一行。也许叫做部署。
然后,您可以每隔一秒运行一次sql代理作业,查看该表并发送电子邮件。最后一件事是,记录被标记为emailsend=1,第一次插入时为0。
这应提供必要的关注点分离。如果你仍然无法在技术上是"系统"表的触发器上运行插入,那么你可以采取C计划。
计划C.您的代理作业查询SSISDB表,对于展开中不存在的每个条目,将记录插入到展开表中,其中emailsend=0。(只获取新记录)然后按照计划B进行其余操作。
希望这能有所帮助。