0

我有一个 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
4

0 回答 0