Sql-Server

SQL Server 管理將郵件作為作業的一部分發送

  • April 22, 2021

我有一個 SQL 作業,我想通過它發送電子郵件,但由於某種原因,我無法獲得有關電子郵件未發送原因的任何詳細資訊。此程式碼在查詢視窗中執行時按預期工作,SQL Server 代理也會向我發送錯誤電子郵件,因此我的電子郵件配置文件似乎設置正確。編碼:

BEGIN
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'MailProfile',
@recipients = 'myaccount@emailcom',
@subject = 'Bad Data Report',
@query = N' USE Database;
  DECLARE @yesterday date = getdate() - 1;  select * from Timecards WHERE Date = @yesterday AND (DailyHours > 24.1 OR DailyHours < 0 ) ',
@exclude_query_output = 1,
@attach_query_result_as_file = 1,
@query_result_header = 1,
@query_attachment_filename = 'BadDataQuery.txt'
END

根據該站點上類似問題的一些建議,我嘗試查看 sysmail_allitems 和 sysmail_faileditems,但都沒有記錄任何發送嘗試。我還創建了一個儲存過程,我將工作呼叫作為發送電子郵件的一種迂迴方式,但這也沒有發送電子郵件,也沒有留下錯誤。任何想法可能會發生什麼?

以下是解決問題的一些步驟。執行它們後,您可能能夠確定導致問題的原因。一次執行其中一個以消除可能的問題:

  • 替換@attach_query_result_as_file = 1,@attach_query_result_as_file = 'Danchat',。這個想法是導致錯誤以查看是否導致作業失敗或是否也被忽視;
  • 清理作業步驟,只留下一個簡單的郵件命令,如下所示: EXEC msdb.dbo.sp_send_dbmail @profile_name = 'MailProfile', @recipients = 'myaccount@emailcom', @subject = 'Test';並嘗試執行作業。不要在步驟中使用開始/結束或其他任何內容,只需這樣的簡單程式碼;
  • 要查找問題是否來自@query 變數的參數,請在作業中執行您問題的完整程式碼,但使用此程式碼@query = N'SELECT 1;'而不是原始查詢。如果電子郵件到達,則意味著您只需要更正您的內部查詢,如果未發送電子郵件,則應開始刪除其他選項,直到發送電子郵件才能找到罪魁禍首。
  • 嘗試使用這個:@execute_query_database = 'YourDatabase', @query = N'select * from Timecards WHERE Date >= ''20210418 00:00:00.000'' AND Date < ''20210419 00:00:00.000'' AND (DailyHours > 24.1 OR DailyHours < 0 )',假設這個區間包含任何數據。如果沒有,請在您的表中查詢至少有一行的間隔,以​​查看它是否正常工作。
  • 最後,如果僅在您在查詢中指定表時才發送郵件,則問題可能與權限有關(即使您使用的是管理員帳戶 - 可能正在發生一些上下文變化)。嘗試配置擴展事件會話以擷取請求,您將能夠驗證這一點。

解決方案:

從聊天討論中,我們能夠找出問題實際上是權限問題,並且他能夠根據我關於 XE 會話的最後建議擷取執行內部查詢的實際使用者。

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