【问题标题】:How to set up access to MSSQL 2005 Database Mail?如何设置对 MSSQL 2005 数据库邮件的访问?
【发布时间】:2010-09-29 00:59:27
【问题描述】:

我刚刚在 MSSQL 2005 中设置了数据库邮件。我已经能够从服务器上的管理员帐户和通过 SQL Server 代理作业发送电子邮件。但是,当我尝试通过仅有权访问我们 Web 应用程序的数据库的登录名发送电子邮件时,我无法发送电子邮件。

设置访问数据库邮件的最佳方式是什么?

我有 2 个 senerios 想要发送电子邮件。

  1. 通过 SQL Server 代理计划作业以运行存储过程,该过程执行某些过程,然后发送电子邮件。 (这不是问题)
  2. 有一个从 Web 应用程序调用的存储过程,该应用程序调用另一个可以发送电子邮件的存储过程。 (这是我的权限问题)

可能的解决方案

  1. 我发现授予登录权限的唯一方法是将登录名映射到 msdb 数据库并授予 public数据库邮件用户角色。这真的让我很担心,因为我认为这会给 msdb 数据库提供很多访问权限。

  2. 将我要发送的电子邮件存储在一个表中,然后让 SQL Server 代理作业每隔一段时间查看该表以发送任何排队的电子邮件。这样,Web 应用程序的数据库登录不会执行 [msdb].[dbo].[sp_ send _dbmail] 调用,因此不需要对 msdb 数据库的任何权限。

还有其他解决方案吗?

【问题讨论】:

  • 有趣。希望你能得到答案。

标签: sql-server roles database-mail


【解决方案1】:

您应该能够创建一个存储过程 WITH EXECUTE AS OWNER 选项,以便它在所有者而不是调用者的上下文中运行。

CREATE PROCEDURE [dbo].[sp_SendMail]
(
    @To nvarchar(1000),
    @Subject nvarchar(100),
    @Body nvarchar(max)
)
WITH EXECUTE AS OWNER
AS
BEGIN
    exec msdb.dbo.sp_send_dbmail @profile_name = 'MailProfile', 
                @recipients = @To, 
                @subject = @Subject, 
                @body = @Body
END

【讨论】:

  • 我不知道为什么,但这对我不起作用。作为我们应用程序数据库所有者的登录名是我已成功发送电子邮件的登录名。当我使用推荐的代码时;我收到“对象的执行权限被拒绝”错误。
  • 在 dbo.sp_SendMail 上向用户 1 授予执行权限
【解决方案2】:

我正在尝试做同样的事情,但正在执行

GRANT EXECUTE ON dbo.sp_SendMail TO User1

没有解决这个问题。唯一使此程序起作用的不是添加

EXECUTE AS OWNER

(我仅使用“WITH ENCRYPTION”创建它)并将运行此过程的用户添加到 msdb DatabaseMailUserRole 角色:

USE msdb
GO
EXEC sp_adduser @loginame='USERNAME', @grpname='DatabaseMailUserRole'
GO

谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多