sp_send_dbmail 帶附件
SQL Server 2008,通過 SQL Server 身份驗證連接。
我有一個儲存過程,
DatabaseA
其中呼叫sp_send_dbmail
以msdb
發送帶有文件附件的電子郵件。該文件位於數據庫伺服器上,而不是遠端文件共享上。正在使用的 SQL Server 帳戶不是 sysadmin ,但確實屬於
DatabaseMailUserRole
.msdb
發送不帶附件的電子郵件很好,但是當存在附件時,我收到錯誤消息:
無法模擬客戶端連接安全上下文。附加文件需要集成客戶端登錄
那裡有一些關於此的文章/文章,但有些似乎說相互矛盾的事情。我一直在研究模擬,並且有效的一件事是在儲存過程中
DatabaseA
執行以下操作:EXECUTE AS LOGIN = 'sa' -- or any account with sysadmin privileges EXECUTE msdb..sp_send_dbmail .... REVERT
我沒想到這會起作用,因為我認為要發送附件,您需要使用 Windows 身份驗證。但是它確實有效,但這意味著需要授予較低特權的 SQL Server 帳戶來模擬 sa(或其他 sysadmin 帳戶)的權限。
在將 DBA 的噩夢釋放到野外之前,我作為一名開發人員進行了盡職調查……
**我的問題是:**允許通過 SQL Server(非系統管理員)進行身份驗證的使用者從本地數據庫伺服器磁碟發送電子郵件附件而不打開安全漏洞的良好/安全方法是什麼?
更新:
回复:憑證
我創建了一個新的 Windows 登錄,通過 SSMS 為該帳戶創建了憑據,將這些憑據映射到我的有限權限 SQL Server 帳戶。我得到錯誤:
消息 22051,級別 16,狀態 1,行 0
無法模擬客戶端連接安全上下文。
附加文件需要集成客戶端登錄
我肯定錯過了什麼!
您需要使用憑據:
憑據是包含連接到 SQL Server 外部資源所需的身份驗證資訊(憑據)的記錄。此資訊由 SQL Server 在內部使用。大多數憑據都包含 Windows 使用者名和密碼。
儲存在憑據中的資訊使通過 SQL Server 身份驗證連接到 SQL Server 的使用者能夠訪問伺服器實例之外的資源。當外部資源是 Windows 時,使用者被認證為憑證中指定的 Windows 使用者。
這樣,您可以將發送郵件的 SQL 登錄名與對附件具有文件訪問權限的 NT 憑證相關聯。
我無法讓它與 Credentials 一起使用,但我找到了另一種讓它工作的方法,而無需向正常使用的帳戶授予 sysadmin 模擬權限。
- 將數據庫設置為 TRUSTWORTHY:
ALTER DATABASE <your db> SET TRUSTWORTHY ON;
- 將數據庫的所有者設置為 sysadmin 使用者 - 在本例中,我使用了 sa
EXEC [your db].dbo.sp_changedbowner @loginame = N'sa', @map = false
- 編寫一個儲存過程來發送郵件,聲明如下:
CREATE PROCEDURE dbo.SendMailWithAttachments WITH EXECUTE AS OWNER AS BEGIN EXEC msdb.dbo.sp_send_dbmail ...., @file_attachments = '\\some\remote\file'; END
您也可以只創建一個具有系統管理員所有者的模式,例如“mailXfer”,然後在其中創建儲存過程(即
CREATE PROCEDURE mailXfer.SendMailWithAttachements
)