Sql-Server
級別 16 的 Throw 和 RaiseError 不會導致警報發生
下一個警報已創建:
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_addmessage
sys.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