我有一个 vb.net 4.6.1 Windows 窗体应用程序。在其中,调用了一个 SQL 存储过程。然后,该存储过程从表中删除一条记录。这一切都很好。该表有一个发送电子邮件的删除触发器。由于 msdb 数据库的权限问题,该触发器失败。这里发生了什么?我猜触发器正在尝试使用应用程序用户的 SQL 用户发送电子邮件。我不想在 msdb 数据库中设置每个用户。无论是什么用户导致触发器触发,我都希望触发器运行并发送电子邮件。有没有办法让触发器在不使用应用用户许可的情况下发送电子邮件?
这是错误消息:
The EXECUTE permission was denied on the object 'sp_send_dbmail', database 'msdb', schema 'dbo'.
这是 vb.net 代码。它只是调用存储过程:
Dim cmd As SqlCommand = MSSQL_CONN.CreateCommand
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "sp_cancel_backlog_detail"
cmd.Parameters.Add("@id", SqlDbType.Int).Value = backlog_detail_id
Call cmd.ExecuteNonQuery()
这是应用程序正在使用的连接字符串:
SERVER=sql01;DATABASE=MyDatabase;Integrated Security=SSPI;Connect Timeout=10;Pooling=false;MultipleActiveResultSets=True;
这是存储过程。同样,非常简单,它只是从表中删除一条记录:
CREATE PROCEDURE [dbo].[sp_cancel_backlog_detail] @id int
DELETE FROM backlog_details WHERE id = @id;
这是表上的删除触发器。这是发送电子邮件的地方:
ALTER TRIGGER [dbo].[delete_backlog_details] ON [dbo].[backlog_details]
AFTER DELETE
AS
BEGIN
DECLARE @body NVARCHAR(MAX)
DECLARE @subj VARCHAR(255), @rcpt VARCHAR(MAX), @atch VARCHAR(255), @q VARCHAR(255), @profile VARCHAR(255)
SET @rcpt = 'xxxxx'
SET @subj = 'Deleted'
SELECT @profile = value
FROM dishbooks.dbo.settings
WHERE name = 'event_manager.dbmail_profile'
EXEC msdb.dbo.sp_send_dbmail
@execute_query_database = 'MyDatabase',
@profile_name = @profile,
@blind_copy_recipients = @rcpt,
@subject = @subj,
@body = @body,
@body_format = 'HTML'
END