Sql-Server

帶有附件查詢的 send_db_mail 看不到使用者數據庫

  • January 21, 2019

我有一個使用以下程式碼呼叫 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 登錄名。

引用自:https://dba.stackexchange.com/questions/152979