Sql-Server-2017

SQL Server 代理警報和嚴重性錯誤

  • September 29, 2020

我已經在 SQL 代理中為嚴重級別 15-16 的錯誤設置了警報以進行測試,並發現這些並不總是

被觸發更準確地說,這些似乎只有在給定的錯誤號有時才會is_event_logged = 1觸發sys.messages

這意味著當執行以下命令時:

create table  -- Msg 102,  Level 15, State 1  -- Incorrect syntax near 'table'
select 1/0    -- Msg 8134, Level 16, State 1  -- Divide by zero error encountered

這些錯誤(102、8134)已is_event_logged = 0寫入且未寫入應用程序日誌 -> 不會觸發嚴重錯誤級別 15-16 的警報

當我嘗試生成具有 is_event_logged = 1 的錯誤嚴重性 15 或 16 時,警報觸發就好了

raiserror(18054,16,1)
raiserror(15716,15,1)

與嚴重性 17-25 錯誤相同,只有具有is_event_logged = 1, 的錯誤才能觸發警報

問題:

  1. 似乎不是錯誤的嚴重級別,但實際上is_event_logged列控制錯誤是否可以觸發查找嚴重級別錯誤的警報?這是 SQL Server 中的預期行為嗎?
  2. 如果我需要創建自定義錯誤消息作為應用程序的警報,使用sp_addmessage過程,然後為此錯誤消息設置警報,@severity 參數並不重要,我需要使用@with_log 參數嗎?
  3. 有沒有辦法讓給定嚴重級別(15、16、17-25)的所有錯誤觸發警報,無論 is_event_logged 等於 1 還是 0 ?我害怕錯過一些重要的事情,因為有很多 17-25 嚴重性錯誤沒有記錄到 app.log -> 不要觸發警報電子郵件?

是的,這是按設計工作的。

查看文件

SQL Server 代理讀取應用程序日誌並將其中寫入的事件與您定義的警報進行比較。

用於 SQL 代理警報的機制是讀取日誌。因此,如果沒有記錄,則沒有警報。

相反,您可以使用擴展事件來擷取錯誤,即使它們沒有被記錄。然後,您可以編寫自己的程序來讀取擴展事件文件並根據需要發送警報。

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