Sql-Server

級別 16 的 Throw 和 RaiseError 不會導致警報發生

  • September 9, 2014

下一個警報已創建:

USE [msdb]
GO

/****** Object:  Alert [Notify]    Script Date: 09/09/2014 11:38:31 ******/
EXEC msdb.dbo.sp_add_alert @name=N'Notify', 
       @message_id=0, 
       @severity=16, 
       @enabled=1, 
       @delay_between_responses=0, 
       @include_event_description_in=0, 
       @category_name=N'[Uncategorized]', 
       @job_id=N'00000000-0000-0000-0000-000000000000'
GO

我希望下一個程式碼會導致它發生:

THROW 51000, 'The record does not exist.', 1;

或者下一個程式碼:

RAISERROR ('Error raised.', 16,  1);

系統消息不包含錯誤消息:

SELECT *
FROM sys.messages  
WHERE language_id = 1033 
and severity>=16
ORDER BY severity asc, message_id asc

我在“歷史”選項卡中也沒有事件: 在此處輸入圖像描述


我錯過了什麼?

通過閱讀關於sp_add_alert的 BOL 文章

$$ @severity = $$嚴重性- 定義警報的嚴重性級別(從 1 到 25)。儲存在 sysmessages 表中的任何 SQL Server 消息發送到 Microsoft Windows 應用程序日誌並具有指示的嚴重性,都會導致發送警報。嚴重性為 int,預設為 0。如果使用 message_id 定義警報,嚴重性必須為 0。

如果要為使用者定義的錯誤消息添加警報,則需要使用sp_addmessagesys.messages將錯誤消息添加到表中

  EXEC sp_addmessage @msgnum= 90210, @severity=16, @msgtext='Error raised.',  @lang= 1033;

要真正提高錯誤警報,您必須注意一些警告(認真……閱讀線上指南……這就是我在這裡所做的一切……

在這些情況下,SQL Server 和 SQL Server 應用程序生成的錯誤/消息會發送到 Windows 應用程序日誌,因此會引發警報:

• 19 級或更高級別的 sys.messages 錯誤

• 使用 WITH LOG 語法呼叫的任何 RAISERROR 語句

• 使用 sp_altermessage 修改或創建的任何 sys.messages 錯誤

• 使用 xp_logevent 記錄的任何事件

因此,RAISERROR對於嚴重性為 16 的錯誤,預設情況下不僅會提醒您,您還需要在WITH LOG其後添加。

RAISERROR(@ErrorMessage, @ErrorSeverity, 1) WITH LOG

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