Sql-Server
帶有附件查詢的 send_db_mail 看不到使用者數據庫
我有一個使用以下程式碼呼叫 send_db_mail 的 SQL 代理作業:
DECLARE @FileName VARCHAR(30) SET @FileName= 'FileName'+CONVERT(VARCHAR(20),GETDATE(),112)+'.csv' EXEC msdb.dbo.sp_send_dbmail @profile_name = 'SQL Admins', @recipients = 'my@email.address.com', @body = 'Attached are the results of the query.', @query = 'SELECT columns from MyDatabase.dbo.MyTable', @subject = 'Test Run', @attach_query_result_as_file = 1 , @query_attachment_filename = @FileName, @query_result_separator = ',', @query_result_no_padding=1, @query_result_header = 0, @query_result_width = 32767, @exclude_query_output=1, @append_query_error = 1;
當我通過 SSMS 執行該程式碼時,我收到了一封電子郵件,它執行良好。當我執行該作業時,它成功了,但我沒有收到任何電子郵件。
我檢查了以下內容:
- 什麼都沒有出現在
sysmail_allitems
- 沒有出現錯誤
sysmail_event_log
- 如果我改變
@query = 'select 1 as squirrel'
它會從工作中發送一封電子郵件。- 如果我改變
@query = 'select name from master.sys.databases'
它會從工作中發送一封電子郵件。沒有發送電子郵件時不會給出錯誤消息,並且作業甚至列為成功。
我不知道下一步該去哪裡找 - 任何人都可以建議在哪裡尋找問題嗎?
當您通過 SSMS 啟動查詢時,它將使用您的帳戶,但是當它通過 SQLAgent 作業啟動時,它將使用執行服務的帳戶。可以在表格的
send_request_user
列中仔細檢查sysmail_allitems
。也許他們有不同的權利?
已經有一段時間了,但是作業(步驟)是在什麼上下文中執行的?當您在 SSMS 中執行腳本時,您是在登錄上下文中執行的,它確實具有足夠的權限。
SQL Server 代理服務權限
如果作業在 SQL Server 代理服務帳戶的上下文中執行,則該語句可能由於缺少權限而未執行。
NT SERVICE\SQLSERVERAGENT
僅當您的服務已設置為在安裝過程中使用預設帳戶執行時,SQL Server 代理服務才使用該帳戶。如果您使用的是專用
<domain>/<user>
帳戶,則該帳戶必須在您的 SQL Server 實例中具有相應的 SQL Server 登錄名。