importance of creating SQL Server Agent Alerts<\/a>. I wanted to make it even easier to create a set of very important SQL Server Agent Alerts by just running a relatively simple T-SQL script. The code below automatically picks up the server name and uses that as part of the alert name. It also uses variables for the operator name and for the alert category name. In this script, the delay between responses is set to 900 seconds, which is 15 minutes. That might be a little on the long side, but I did not want the operator to get spammed with e-mail alerts every couple of minutes. You can always adjust that value to whatever you see fit.<\/p>\nYou need to make sure that you have a SQL Operator defined for your instance (and that you change the name of the operator in the script below to match your Operator name). You also need to make sure that you have Database Mail properly configured and enabled, so that you will actually get an e-mail when one of your SQL Server Agent Alerts is triggered.<\/p>\n
-- Add important SQL Agent Alerts to your instance<\/span>\r\n-- Change the @OperatorName as needed<\/span>\r\n\r\nUSE<\/span> [msdb];\r\nGO<\/span>\r\n\r\n-- Make sure you have an Agent Operator defined<\/span>\r\n-- Change @OperatorName as needed<\/span>\r\nDECLARE<\/span> @OperatorName sysname = N'SQLDBAGroup'<\/span>;\r\n\r\n-- Change @CategoryName as needed<\/span>\r\nDECLARE<\/span> @CategoryName sysname = N'SQL Server Agent Alerts'<\/span>;\r\n\r\n-- Add Alert Category if it does not exist<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span> (SELECT<\/span> *\r\n FROM<\/span> msdb.dbo.syscategories\r\n WHERE<\/span> category_class = 2 -- ALERT<\/span>\r\n AND<\/span> category_type = 3\r\n AND<\/span> name = @CategoryName)\r\n BEGIN<\/span>\r\n EXEC<\/span> dbo.sp_add_category @class<\/span> = N'ALERT'<\/span>, @type = N'NONE'<\/span>, @name = @CategoryName;\r\n END<\/span>\r\n\r\n-- Get the server name<\/span>\r\nDECLARE<\/span> @ServerName sysname = (SELECT<\/span> @@SERVERNAME);\r\n\r\n-- Alert Names start with the name of the server <\/span>\r\nDECLARE<\/span> @Sev19AlertName sysname = @ServerName + N' Alert - Sev 19 Error: Fatal Error in Resource'<\/span>;\r\nDECLARE<\/span> @Sev20AlertName sysname = @ServerName + N' Alert - Sev 20 Error: Fatal Error in Current Process'<\/span>;\r\nDECLARE<\/span> @Sev21AlertName sysname = @ServerName + N' Alert - Sev 21 Error: Fatal Error in Database Process'<\/span>;\r\nDECLARE<\/span> @Sev22AlertName sysname = @ServerName + N' Alert - Sev 22 Error Fatal Error: Table Integrity Suspect'<\/span>;\r\nDECLARE<\/span> @Sev23AlertName sysname = @ServerName + N' Alert - Sev 23 Error: Fatal Error Database Integrity Suspect'<\/span>;\r\nDECLARE<\/span> @Sev24AlertName sysname = @ServerName + N' Alert - Sev 24 Error: Fatal Hardware Error'<\/span>;\r\nDECLARE<\/span> @Sev25AlertName sysname = @ServerName + N' Alert - Sev 25 Error: Fatal Error'<\/span>;\r\nDECLARE<\/span> @Error825AlertName sysname = @ServerName + N' Alert - Error 825: Read-Retry Required'<\/span>;\r\n\r\n-- Sev 19 Error: Fatal Error in Resource<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span> (SELECT<\/span> name FROM<\/span> msdb.dbo.sysalerts WHERE<\/span> name = @Sev19AlertName)\r\n EXEC<\/span> msdb.dbo.sp_add_alert @name = @Sev19AlertName, \r\n @message_id=0, @severity=19, @enabled=1, \r\n @delay_between_responses=900, @include_event_description_in=1,\r\n @category_name = @CategoryName, \r\n @job_id=N'00000000-0000-0000-0000-000000000000'<\/span>;\r\n\r\n-- Add a notification if it does not exist<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span>(SELECT<\/span> *\r\n FROM<\/span> dbo.sysalerts AS<\/span> sa\r\n INNER<\/span> JOIN<\/span> dbo.sysnotifications AS<\/span> sn\r\n ON<\/span> sa.id = sn.alert_id\r\n WHERE<\/span> sa.name = @Sev19AlertName)\r\n BEGIN<\/span>\r\n EXEC<\/span> msdb.dbo.sp_add_notification @alert_name = @Sev19AlertName, @operator_name=@OperatorName, @notification_method = 1;\r\n END<\/span>\r\n\r\n-- Sev 20 Error: Fatal Error in Current Process<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span> (SELECT<\/span> name FROM<\/span> msdb.dbo.sysalerts WHERE<\/span> name = @Sev20AlertName)\r\n EXEC<\/span> msdb.dbo.sp_add_alert @name = @Sev20AlertName, \r\n @message_id=0, @severity=20, @enabled=1, \r\n @delay_between_responses=900, @include_event_description_in=1,\r\n @category_name = @CategoryName, \r\n @job_id=N'00000000-0000-0000-0000-000000000000'<\/span>\r\n\r\n-- Add a notification if it does not exist<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span>(SELECT<\/span> *\r\n FROM<\/span> dbo.sysalerts AS<\/span> sa\r\n INNER<\/span> JOIN<\/span> dbo.sysnotifications AS<\/span> sn\r\n ON<\/span> sa.id = sn.alert_id\r\n WHERE<\/span> sa.name = @Sev20AlertName)\r\n BEGIN<\/span>\r\n EXEC<\/span> msdb.dbo.sp_add_notification @alert_name = @Sev20AlertName, @operator_name=@OperatorName, @notification_method = 1;\r\n END<\/span>\r\n\r\n-- Sev 21 Error: Fatal Error in Database Process<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span> (SELECT<\/span> name FROM<\/span> msdb.dbo.sysalerts WHERE<\/span> name = @Sev21AlertName)\r\n EXEC<\/span> msdb.dbo.sp_add_alert @name = @Sev21AlertName, \r\n @message_id=0, @severity=21, @enabled=1, \r\n @delay_between_responses=900, @include_event_description_in=1,\r\n @category_name = @CategoryName, \r\n @job_id=N'00000000-0000-0000-0000-000000000000'<\/span>;\r\n\r\n-- Add a notification if it does not exist<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span>(SELECT<\/span> *\r\n FROM<\/span> dbo.sysalerts AS<\/span> sa\r\n INNER<\/span> JOIN<\/span> dbo.sysnotifications AS<\/span> sn\r\n ON<\/span> sa.id = sn.alert_id\r\n WHERE<\/span> sa.name = @Sev21AlertName)\r\n BEGIN<\/span>\r\n EXEC<\/span> msdb.dbo.sp_add_notification @alert_name = @Sev21AlertName, @operator_name=@OperatorName, @notification_method = 1;\r\n END<\/span>\r\n\r\n-- Sev 22 Error: Fatal Error Table Integrity Suspect<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span> (SELECT<\/span> name FROM<\/span> msdb.dbo.sysalerts WHERE<\/span> name = @Sev22AlertName)\r\n EXEC<\/span> msdb.dbo.sp_add_alert @name = @Sev22AlertName, \r\n @message_id=0, @severity=22, @enabled=1, \r\n @delay_between_responses=900, @include_event_description_in=1,\r\n @category_name = @CategoryName, \r\n @job_id=N'00000000-0000-0000-0000-000000000000'<\/span>;\r\n\r\n-- Add a notification if it does not exist<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span>(SELECT<\/span> *\r\n FROM<\/span> dbo.sysalerts AS<\/span> sa\r\n INNER<\/span> JOIN<\/span> dbo.sysnotifications AS<\/span> sn\r\n ON<\/span> sa.id = sn.alert_id\r\n WHERE<\/span> sa.name = @Sev22AlertName)\r\n BEGIN<\/span>\r\n EXEC<\/span> msdb.dbo.sp_add_notification @alert_name = @Sev22AlertName, @operator_name=@OperatorName, @notification_method = 1;\r\n END<\/span>\r\n\r\n-- Sev 23 Error: Fatal Error Database Integrity Suspect<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span> (SELECT<\/span> name FROM<\/span> msdb.dbo.sysalerts WHERE<\/span> name = @Sev23AlertName)\r\n EXEC<\/span> msdb.dbo.sp_add_alert @name = @Sev23AlertName, \r\n @message_id=0, @severity=23, @enabled=1, \r\n @delay_between_responses=900, @include_event_description_in=1,\r\n @category_name = @CategoryName, \r\n @job_id=N'00000000-0000-0000-0000-000000000000'<\/span>;\r\n\r\n-- Add a notification if it does not exist<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span>(SELECT<\/span> *\r\n FROM<\/span> dbo.sysalerts AS<\/span> sa\r\n INNER<\/span> JOIN<\/span> dbo.sysnotifications AS<\/span> sn\r\n ON<\/span> sa.id = sn.alert_id\r\n WHERE<\/span> sa.name = @Sev23AlertName)\r\n BEGIN<\/span>\r\n EXEC<\/span> msdb.dbo.sp_add_notification @alert_name = @Sev23AlertName, @operator_name = @OperatorName, @notification_method = 1;\r\n END<\/span>\r\n\r\n-- Sev 24 Error: Fatal Hardware Error<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span> (SELECT<\/span> name FROM<\/span> msdb.dbo.sysalerts WHERE<\/span> name = @Sev24AlertName)\r\n EXEC<\/span> msdb.dbo.sp_add_alert @name = @Sev24AlertName, \r\n @message_id=0, @severity=24, @enabled=1, \r\n @delay_between_responses=900, @include_event_description_in=1,\r\n @category_name = @CategoryName, \r\n @job_id=N'00000000-0000-0000-0000-000000000000'<\/span>;\r\n\r\n-- Add a notification if it does not exist<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span>(SELECT<\/span> *\r\n FROM<\/span> dbo.sysalerts AS<\/span> sa\r\n INNER<\/span> JOIN<\/span> dbo.sysnotifications AS<\/span> sn\r\n ON<\/span> sa.id = sn.alert_id\r\n WHERE<\/span> sa.name = @Sev24AlertName)\r\n BEGIN<\/span>\r\n EXEC<\/span> msdb.dbo.sp_add_notification @alert_name = @Sev24AlertName, @operator_name = @OperatorName, @notification_method = 1;\r\n END<\/span>\r\n\r\n-- Sev 25 Error: Fatal Error<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span> (SELECT<\/span> name FROM<\/span> msdb.dbo.sysalerts WHERE<\/span> name = @Sev25AlertName)\r\n EXEC<\/span> msdb.dbo.sp_add_alert @name = @Sev25AlertName, \r\n @message_id=0, @severity=25, @enabled=1, \r\n @delay_between_responses=900, @include_event_description_in=1, \r\n @category_name = @CategoryName,\r\n @job_id=N'00000000-0000-0000-0000-000000000000'<\/span>;\r\n\r\n-- Add a notification if it does not exist<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span>(SELECT<\/span> *\r\n FROM<\/span> dbo.sysalerts AS<\/span> sa\r\n INNER<\/span> JOIN<\/span> dbo.sysnotifications AS<\/span> sn\r\n ON<\/span> sa.id = sn.alert_id\r\n WHERE<\/span> sa.name = @Sev25AlertName)\r\n BEGIN<\/span>\r\n EXEC<\/span> msdb.dbo.sp_add_notification @alert_name = @Sev25AlertName, @operator_name = @OperatorName, @notification_method = 1;\r\n END<\/span>\r\n\r\n-- Error 825: Read-Retry Required<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span> (SELECT<\/span> name FROM<\/span> msdb.dbo.sysalerts WHERE<\/span> name = @Error825AlertName)\r\n EXEC<\/span> msdb.dbo.sp_add_alert @name = @Error825AlertName, \r\n @message_id=825, @severity=0, @enabled=1, \r\n @delay_between_responses=900, @include_event_description_in=1, \r\n @category_name = @CategoryName, \r\n @job_id=N'00000000-0000-0000-0000-000000000000'<\/span>;\r\n\r\n-- Add a notification if it does not exist<\/span>\r\nIF<\/span> NOT<\/span> EXISTS<\/span>(SELECT<\/span> *\r\n FROM<\/span> dbo.sysalerts AS<\/span> sa\r\n INNER<\/span>