sql >> Database >  >> RDS >> Sqlserver

Database-e-mailmeldingen configureren in MS SQL Server

Inleiding

Vaak is het nodig om beheerders op de een of andere manier te informeren over de problemen met een server. Meldingen zijn over het algemeen onderverdeeld in 2 typen:

1) realtime meldingen, d.w.z. meldingen die onmiddellijk moeten komen als er een probleem optreedt

2) vertraagde meldingen, d.w.z. meldingen die vrij lang (meer dan 1 uur) na het optreden van een probleem binnenkomen.

In mijn werk was het nodig om de functionaliteit van de reguliere SQL Server Database Mail uit te breiden.

In dit artikel zullen we een voorbeeld bekijken van hoe u meldingen in HTML-tabellen kunt genereren en deze vervolgens naar beheerders kunt sturen.

Oplossing

1. Database Mail configureren

2. Maak een tabel voor ontvangers:

[uitbreiden titel =”Code”]

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[Recipient]( [Recipient_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Recipient_Name] [nvarchar](255) NOT NULL, [ // een primaire e-mail van de ontvanger Recipient_Code] [nvarchar] (10) NOT NULL, // code van de ontvanger [IsDeleted] [bit] NOT NULL, // een verwijderingsindicator (of een ontvanger wordt gebruikt of niet) [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_Recipient ] PRIMAIRE SLEUTEL GECLUSTERD ( [Recipient_GUID] ASC)MET (PAD_INDEX =UIT, STATISTICS_NORECOMPUTE =UIT, IGNORE_DUP_KEY =UIT, ALLOW_ROW_LOCKS =AAN, ALLOW_PAGE_LOCKS =AAN) AAN [PRIMARY], CONSTRRAINTHONde]Ontvanger) (PAD_INDEX =UIT, STATISTICS_NORECOMPUTE =UIT, IGNORE_DUP_KEY =UIT, ALLOW_ROW_LOCKS =AAN, ALLOW_PAGE_LOCKS =AAN) AAN [PRIMARY], BEPERKTE [AK_Recipient_Name] UNIEKE NIET-CLUSTERD ([Ontvanger_Naam] ASC_)WITH =( F, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]GOALTER TABLE [srv].[Ontvanger] ADD CONSTRAINT [DF_Recipient_Recipient_GUID] STANDAARD (newsequentiaRecipient_Recipient_GUID] STANDAARD (newsequentiaRecipient()GUID] srv].[Ontvanger] ADD CONSTRAINT [DF_Recipient_IsDeleted] STANDAARD ((0)) FOR [IsDeleted]GOALTER TABLE [srv].[Ontvanger] ADD CONSTRAINT [DF_Recipient_InsertUTCDate] STANDAARD (getutcdate()CDate] FOR [InsertUTCdate] 

[/expand]

3. Maak een tabel voor de adressen van de ontvangers:

[uitbreiden titel =”Code”]

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[Address]( [Address_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Recipient_GUID] [uniqueidentifier] [NULL,] // ontvanger 255) NOT NULL, // email [IsDeleted] [bit] NOT NULL, // verwijderingsindicator (of e-mail wordt gebruikt of niet) [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED ( [Address_GUID] ASC )MET (PAD_INDEX =UIT, STATISTICS_NORECOMPUTE =UIT, IGNORE_DUP_KEY =UIT, ALLOW_ROW_LOCKS =AAN, ALLOW_PAGE_LOCKS =AAN) AAN [PRIMAIR], BEPERKTE [AK_Adres] UNIEK NIET GECLUSTERD ( [Ontvanger_GUIDDress] ASC, [D , STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]GOALTER TABLE [srv].[Adres] ADD CONSTRINT [DF_Address_Address_GUID] DE GOALTERTAFEL [ srv].[Adres] ADD CONSTRAINT [DF_Address_IsDeleted] STANDAARD ((0)) FOR [IsDeleted]GOALTER TABLE [srv].[Adres] ADD CONSTRAINT [DF_Address_InsertUTCDate] STANDAARD (getutcdate()) FOR]GO[/expand]

4. Maak een tabel voor een berichtenwachtrij:

[uitbreiden titel =”Code”]

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[ErrorInfo]( [ErrorInfo_GUID] [uniqueidentifier] NOT NULL, [ERROR_TITLE] [nvarchar](max) NULLOR_] (max) NULL, // voorlopige informatie [ERROR_NUMBER] [nvarchar](max) NULL, // bericht (fout) code [ERROR_MESSAGE] [nvarchar](max) NULL, // bericht [ERROR_LINE] [nvarchar](max) NULL, // regelnummer [ERROR_PROCEDURE] [nvarchar](max) NULL, // opgeslagen procedure [ERROR_POST_MESSAGE] [nvarchar](max) NULL, // verklarende informatie [RECIPIENTS] [nvarchar](max) NULL, // ontvangers gescheiden door ';' [InsertDate] [datetime] NOT NULL, [StartDate] [datetime] NOT NULL, // startgegevens en tijd [FinishDate] [datetime] NOT NULL, // einddatum en -tijd [Count] [int] NOT NULL, // aantal keren [UpdateDate] [dat etime] NOT NULL, [IsRealTime] [bit] NOT NULL, // realtime indicator [InsertUTCDate] [datetime] NULL, CONSTRAINT [PK_ErrorInfo] PRIMAIRE SLEUTEL GECLUSTERD ([ErrorInfo_GUID] ASC)MET (PAD_INDEX =OFF, STATUSTIEK =UIT, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOALTER TABLE [srv].[ErrorInfo] ADD CONSTRINT [DF_ErrorInfo_ErrorINfo_GUTERID](new) TABEL [srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_InsertDate] STANDAARD (getdate()) FOR [InsertDate]GOALTER TABLE [srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_StartDate] [GOTERTATEDate()) FOR [StartDate()) srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_FinishDate] STANDAARD (getdate()) FOR [FinishDate]GOALTER TABLE [srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_Count] STANDAARD ((1))TER [Count] .[ErrorInfo] BEPERKING TOEVOEGEN [DF__ErrorInfo__Updat__5FFEE747] STANDAARD LT (getdate()) FOR [UpdateDate]GOALTER TABLE [srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_IsRealTime] STANDAARD ((0)) FOR [IsRealTime]GOALTER TABLE [srv].[ErrorInfo] ADD CONSTRAINT [DF_InrertorULTCD] getutcdate()) VOOR [InsertUTCDate]GO

[/expand]

5. Maak een archieftabel voor berichten die vanuit de berichtenwachtrij zijn verzonden:

[uitbreiden titel =”Code”]

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[ErrorInfoArchive]( [ErrorInfo_GUID] [unieke identificatie] ROWGUIDCOL NOT NULL, [ERROR_TITLEER] [nvarchar](MESSR) ) NULL, [ERROR_NUMBER] [nvarchar](max) NULL, [ERROR_MESSAGE] [nvarchar](max) NULL, [ERROR_LINE] [nvarchar](max) NULL, [ERROR_PROCEDURE] [nvarchar](max) NULL, [ERROR_POST_MESSAGE] [nvarchar](max) NULL, [RECIPIENTS] [nvarchar](max) NULL, [InsertDate] [datetime] NOT NULL, [StartDate] [datetime] NOT NULL, [FinishDate] [datetime] NOT NULL, [Count] [ int] NOT NULL, [UpdateDate] [datetime] NOT NULL, [IsRealTime] [bit] NOT NULL, [InsertUTCDate] [datetime] NULL, CONSTRAINT [PK_ArchiveErrorInfo] PRIMAIRE SLEUTEL GECLUSTERD ([ErrorInfo_GUID] ASC)EXWITH =(PAD_IND) STATISTICS_NORECOMPUTE =UIT, IGNORE_DUP_KEY =UIT, ALLOW_ROW_LOCKS =AAN, ALLOW_PAGE_LOCKS =AAN) AAN [PRIMAIR]) AAN [PRIMAIR] TEXTIMAGE_ON [PRIMAIR]GOALTE R TABEL [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_ErrorInfo_GUID] DEFAULT (newsequentialid()) FOR [ErrorInfo_GUID]GOALTER TABLE [srv].[ErrorInfoInfoArchive] ADDArchiveTERr [DF_CONSTRAALErr [DF_CONSTRAALErr] [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_StartDate] STANDAARD (getdate()) FOR [StartDate]GOALTER TABLE [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_StartDate] (Datum] DEFinishgedate] ].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_Count] STANDAARD ((1)) FOR [Count]GOALTER TABLE [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_UpdateDate] STANDAARD]. [ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_IsRealTime] STANDAARD ((0)) FOR [IsRealTime]GOALTER TABLE [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_InsertUTCdate] DEFAULT opnieuw> 

[/expand]

Deze informatie is nodig voor de geschiedenis. Bovendien moet deze tabel worden gewist van zeer oude gegevens (bijvoorbeeld ouder dan een maand).

6. Maak een opgeslagen procedure die een nieuw bericht in de berichtenwachtrij registreert:

[uitbreiden titel =”Code”]

GEBRUIKEN [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[ErrorInfoIncUpd] @ERROR_TITLE nvarchar(max), @ERROR_PRED_MESSAGE nvarchar(max), @ERROR_char(max), @ERROR_PRINC. nvarchar(max), @ERROR_PROCEDURE nvarchar(max), @ERROR_POST_MESSAGE nvarchar(max), @RECIPIENTS nvarchar(max), @StartDate datetime=null, @FinishDate datetime=null, @IsRealTime bit =0ASBEGIN /* Fout bij inloggen op de fout tabel moet per e-mail worden verzonden als de tabel al een item heeft met dezelfde titel, inhoud en afzender, de einddatum van de fout, de datum van de recordupdate en het aantal fouten zal veranderen */ STEL NOCOUNT IN AAN; declareren @ErrorInfo_GUID uniqueidentifier; selecteer top 1 @ErrorInfo_GUID=ErrorInfo_GUID van srv.ErrorInfo waarbij ([email protected]_TITLE of @ERROR_TITLE is null) en [email protected] en ([email protected]_MESSAGE of @REDERROR_MESSAGE_ERROR_MESSAGE_ERROR_MESSAGE of @ERROR_PRED_MESSAGE is null) en ([email protected]_POST_MESSAGE of @ERROR_POST_MESSAGE is null) en ([email protected] of @IsRealTime is null); if(@ErrorInfo_GUID is null) begin insert into srv.ErrorInfo ( ERROR_TITLE ,ERROR_PRED_MESSAGE ,ERROR_NUMBER ,ERROR_MESSAGE ,ERROR_LINE ,ERROR_PROCEDURE ,ERROR_POST_MESSAGE ,RECIPIENTS ,IsRealTime ,StartDate ,FinishDate ) select @ERROR_TITLE ,@ERROR_PRED_MESSAGE ,@ERROR_NUMBER ,@ERROR_MESSAGE ,@ ERROR_LINE ,@ERROR_PROCEDURE ,@ERROR_POST_MESSAGE ,@RECIPIENTS ,@IsRealTime ,isnull(@StartDate, getdate()) ,isnull(@FinishDate,getdate()) end else begin update srv.ErrorInfo set FinishDate=getdate(), [Count]=[Count]+1, UpdateDate=getdate() waar [email protected]_GUID; endENDGO

[/expand]

7. Maak een opgeslagen procedure die een tekenreeks retourneert van de adressen door de code of het primaire e-mailadres van een ontvanger:

[uitbreiden titel =”Code”]

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[GetRecipients]@Recipient_Name nvarchar(255)=NULL,@Recipient_Code nvarchar(10)=NULL,@varcharients outn/*(max.) het creëren van e-mailmeldingen*/ASBEGIN STEL NOCOUNT IN; stel @Ontvangers='' in; selecteer @[email protected]+d.[Adres]+';' van srv.Recipient as r inner join srv.[Address] as d on r.Recipient_GUID=d.Recipient_GUID waar ([email protected]_Name of @Recipient_Name IS NULL) en ([email protected]_Code of @Recipient_Code IS NULL) r.IsDeleted=0 en d.IsDeleted=0; --bestellen door r.InsertUTCDate desc, d.InsertUTCDate desc; if(len(@Recipients)>0) set @Recipients=substring(@Recipients,1,len(@Recipients)-1);ENDGO

[/expand]

8. Creëer de nodige functies voor het werken met datums en tijd:

[uitbreiden titel =”Code”]

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTIE [rep].[GetDateFormat] ( @dt datetime, // input date @format int=0 // preset format)RETURNS nvarchar(255)AS/* Geeft datum als een string volgens het gespecificeerde formaat en de invoerdatum Vult waar nodig nullen in:formaat invoerdatum resultaat 0 17.4.2014 "17.04.2014" 1 17.4.2014 "04.2014" 1 8.11.2014 "11.2014" 2 17.04.2014 "2014" */BEGIN VERKLAREN @res nvarchar(255); VERKLAREN @dag int=DAG(@dt); VERKLAREN @maand int=MAAND(@dt); VERKLAREN @jaar int=JAAR(@dt); if(@format=0) begin set @res=IIF(@day<10,'0'+cast(@day as nvarchar(1)), cast(@day as nvarchar(2)))+'.'; set @[email protected]+IIF(@maand<10,'0'+cast(@maand als nvarchar(1)), cast(@maand als nvarchar(2)))+'.'; stel @[email protected]+cast(@jaar in als nvarchar(255)); end else if(@format=1) begin set @res=IIF(@month<10,'0'+cast(@month as nvarchar(1)), cast(@month as nvarchar(2)))+'. '; stel @[email protected]+cast(@jaar in als nvarchar(255)); end else if(@format=2) begin set @res=cast(@year as nvarchar(255)); end RETURN @res;ENDGOUSE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTIE [rep].[GetTimeFormat] ( @dt datetime, // input time @format int=0 // preset format)RETURNS nvarchar(255)AS/* Returns tijd als een string volgens het gespecificeerde formaat en de invoertijd Vult waar nodig nullen in:formaat invoertijd resultaat 0 17:04 "17:04:00" 1 17:04 "17:04" 1 8:04 "08:04 " 2 17:04 "17"*/BEGIN VERKLAREN @res nvarchar(255); VERKLAREN @hour int=DATEPART(HOUR, @dt); VERKLAREN @min int=DATEPART(MINUTE, @dt); VERKLAREN @sec int=DATEPART(SECOND, @dt); if(@format=0) begin set @res=IIF(@hour<10,'0'+cast(@hour as nvarchar(1)), cast(@hour as nvarchar(2)))+':'; set @[email protected]+IIF(@min<10,'0'+cast(@min als nvarchar(1)), cast(@min als nvarchar(2)))+':'; set @[email protected]+IIF(@sec<10,'0'+cast(@sec als nvarchar(1)), cast(@sec als nvarchar(2))); end else if(@format=1) begin set @res=IIF(@hour<10,'0'+cast(@hour as nvarchar(1)), cast(@hour as nvarchar(2)))+':'; set @[email protected]+IIF(@min<10,'0'+cast(@min als nvarchar(1)), cast(@min als nvarchar(2))); end else if(@format=2) begin set @res=IIF(@hour<10,'0'+cast(@hour as nvarchar(1)), cast(@hour as nvarchar(2))); einde RETURN @res;ENDGO

[/expand]

9. Maak een opgeslagen procedure die een HTML-rapport over berichten maakt in de vorm van een tabel:

[uitbreiden titel =”Code”]

USE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[GetHTMLTable] @recipients nvarchar(max) ,@dt datetime // op welke datum te lezenASBEGIN /* genereert HTML-code NOCOUNT ON */; verklaar @body nvarchar(max); declare @tbl table(ID int identity(1,1) ,[ERROR_TITLE] nvarchar(max) ,[ERROR_PRED_MESSAGE] nvarchar(max) ,[ERROR_NUMBER] nvarchar(max) ,[ERROR_MESSAGE] nvarchar(max) ,[ERROR_LINE] (max) ,[ERROR_PROCEDURE] nvarchar(max) ,[ERROR_POST_MESSAGE] nvarchar(max) ,[InsertDate] datetime ,[StartDate] datetime ,[FinishDate] datetime ,[Count] int ); declareren @ID int ,@ERROR_TITLE nvarchar(max) ,@ERROR_PRED_MESSAGE nvarchar(max) ,@ERROR_NUMBER nvarchar(max) ,@ERROR_MESSAGE nvarchar(max) ,@ERROR_LINE nvarchar(max)_PRO_CEDUR (max) ,@InsertDate datetime ,@StartDate datetime ,@FinishDate datetime ,@Count int invoegen in @tbl( [ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSAGE] ,[ERROR_ROSROOD] ] ,[InsertDate] ,[StartDate] ,[FinishDate] ,[Count] ) selecteer top 100 [ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSAGE] ,[ERROR_LINE] ,[ERROR_PROCEDURE] ,[ERROR_POST_MESSAGE] ,[InsertDate] ,[StartDate] ,[FinishDate] ,[Count] van [srv].[ErrorInfo] waar][ampleI@ENTs] ) of (@recipients IS NULL) en InsertDate' in; stel @[email protected]+'' in; set @[email protected]+'№ п/п'; stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+'DATUM' in; stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+'ERROR' in; stel @[email protected]+'' in; stel @[email protected]+'' in; set @[email protected]+'BESCHRIJVING'; stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+'FOUTCODE' in; stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+'BERICHT' in; stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+'START' in; stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+'FINISH' in; stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+'NUMBER' in; stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+'LINE NUMBER' in; stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+'PROCEDURE' in; stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+'OPMERKING' in; stel @[email protected]+'' in; stel @[email protected]+'' in; while((selecteer top 1 1 van @tbl)>0) begin set @[email protected]+''; select top 1 @ID =[ID] ,@ERROR_TITLE =[ERROR_TITLE] ,@ERROR_PRED_MESSAGE=[ERROR_PRED_MESSAGE] ,@ERROR_NUMBER =[ERROR_NUMBER] ,@ERROR_MESSAGE =[ERROR_PRED_MESSAGE] ,@ERROR_NUMBER =[ERROR_NUMBER] ,@ERROR_MESSAGE =[ERROR_PRED_MESSAGE] ,@ERROR_NUMBER =[ERROR_NUMBER] ,@ERROR_MESSAGE =[ERROR_PRED_MESSAGE] ,[MESSAGE] ] ,@ERROR_POST_MESSAGE=[ERROR_POST_MESSAGE] ,@InsertDate =[InsertDate] ,@StartDate =[StartDate] ,@FinishDate =[FinishDate] ,@Count =[Count] van @tbl sorteer op InsertDate asc; stel @[email protected]+'' in; stel @[email protected]+cast(@ID in als nvarchar(max)); stel @[email protected]+'' in; stel @[email protected]+'' in; set @[email protected]+rep.GetDateFormat(@InsertDate, standaard)+' '+rep.GetTimeFormat(@InsertDate, standaard); // cast(@InsertDate als nvarchar(max)); stel @[email protected]+'' in; stel @[email protected]+'' in; set @[email protected]+isnull(@ERROR_TITLE,''); stel @[email protected]+'' in; stel @[email protected]+'' in; set @[email protected]+isnull(@ERROR_PRED_MESSAGE,''); stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+isnull(@ERROR_NUMBER,''); stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+isnull(@ERROR_MESSAGE,''); stel @[email protected]+'' in; stel @[email protected]+'' in; set @[email protected]+rep.GetDateFormat(@StartDate, standaard)+' '+rep.GetTimeFormat(@StartDate, standaard); //cast(@StartDate als nvarchar(max)); stel @[email protected]+'' in; stel @[email protected]+'' in; set @[email protected]+rep.GetDateFormat(@FinishDate, standaard)+' '+rep.GetTimeFormat(@FinishDate, standaard); //cast(@FinishDate als nvarchar(max)); stel @[email protected]+'' in; stel @[email protected]+'' in; stel @[email protected]+cast(@Count as nvarchar(max)); stel @[email protected]+'' in; stel @[email protected]+'' in; set @[email protected]+isnull(@ERROR_LINE,''); stel @[email protected]+'' in; stel @[email protected]+'' in; set @[email protected]+isnull(@ERROR_PROCEDURE,''); stel @[email protected]+'' in; stel @[email protected]+'' in; set @[email protected]+isnull(@ERROR_POST_MESSAGE,''); stel @[email protected]+'' in; verwijderen uit @tbl waar [email protected]; stel @[email protected]+'' in; eindset @[email protected]+''; selecteer @body;ENDGO

[/expand]

10. Maak een opgeslagen procedure die berichten verzendt:

[uitbreiden titel =”Code”]

USE [DATABAE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[RunErrorInfoProc] @IsRealTime bit =0 // verzendmodus (1-realtime)ASBEGIN /* verzend foutmeldingen met de gespecificeerde modus */ STEL NOCOUNT IN; declareren @dt datetime=getdate(); declareren @tbl table(Ontvangers nvarchar(max)); declareer @ontvangers nvarchar(max); declareer @ontvanger nvarchar(255); declare @result nvarchar(max)=''; declareren @recp nvarchar(max); declareren @int; declareren @recipients_key nvarchar(max); // ontvang alle benodigde berichten voeg in @tbl(Recipients) selecteer [RECIPIENTS] van srv.ErrorInfo waar InsertDate0) begin //ontvang ontvangers selecteer top (1) @recipients=Ontvangers van @tbl; stel @[email protected] in; stel @resultaat='' in; // voor elke ontvanger while(len(@recipients)>0) begin set @ind=CHARINDEX(';', @recipients); if(@ind>0) begin set @recipient=substring(@recipients,1, @ind-1); set @recipients=substring(@recipients,@ind+1,len(@recipients)[email protected]); end else begin set @[email protected]; stel @ontvangers='' in; einde; // ontvang e-mails van ontvangers exec [srv].[GetRecipients] @[email protected], @[email protected] out; if(len(@recp)=0) begin exec [srv].[GetRecipients] @[email protected], @[email protected] out; if(len(@recp)=0) set @[email protected]; end // gescheiden door symbool ';' stel @[email protected]@sqldat.com+';'; eindset @result=substring(@result,1,len(@result)-1); stel @[email protected] in; // ontvang HTML-rapport met de opgegeven ontvangers en datum invoegen in @rec_body(Body) exec srv.GetHTMLTable @[email protected]_key, @[email protected]; // ontvang HTML-rapport selecteer top (1) @body=Body van @rec_body; // de daadwerkelijke verzending van EXEC msdb.dbo.sp_send_dbmail // het e-mailen van het beheerdersprofiel dat we hebben gemaakt @profile_name ='ALARM', // e-mail van de ontvanger @recipients =@recipients, // tekst van een bericht @body =@body, // Onderwerp @subject =N'INFORMATION ON EXECUTION ERRORS', @body_format='HTML'--, // Laten we bijvoorbeeld de resultaten van een willekeurige SQL-query toevoegen aan het bericht [email protected] =@query--'SELECT TOP 10 naam FROM sys.objects'; verwijderen uit @tbl waar [email protected]_key; verwijderen uit @rec_body; end // archiveer de verstuurde berichten INSERT INTO [srv].[ErrorInfoArchive] ([ErrorInfo_GUID] ,[ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSAGE] ,[ERROR [MESSAGE] ,[ERROR[URERER]PRO,C RECIPIENTS] ,[StartDate] ,[FinishDate] ,[Count] ,IsRealTime ) SELECT [ErrorInfo_GUID] ,[ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_NUMBER] ,[UREROR][MESSRAGEROR]OS [RECIPIENTS] ,[StartDate] ,[FinishDate] ,[Count] ,IsRealTime FROM [srv].[ErrorInfo] waar [email protected] en InsertDate 

[/expand]

Deze opgeslagen procedure haalt elk bericht uit de berichtenwachtrij en verpakt het in een HTML-rapport in de vorm van een tabel. Voor ontvangers creëert het op basis van hun code of primaire e-mailadres een reeks bestaande uit e-mailadressen waarnaar een bericht wordt verzonden. Op deze manier worden alle geselecteerde berichten verwerkt. Hier wordt de opgeslagen procedure msdb.dbo.sp_send_dbmail gebruikt.

11. Maak twee taken in Agent (de eerste is voor realtime meldingen (1 keer per minuut plannen), de tweede is voor eenvoudige meldingen (1 keer per uur plannen). Voeg het volgende toe aan de code van de taak:

UITVOEREN [DATABASE_NAME].[srv].[RunErrorInfoProc] @IsRealTime=0; // 0 - voor eenvoudige berichten en 1 - voor realtime berichten

Hier is een voorbeeld van foutrapportage:

[expand title=”Code”]

begin try exec [DATABASE_NAME].[srv].[KillFullOldConnect];end trybegin catch declare @str_mess nvarchar(max)=ERROR_MESSAGE(), @str_num nvarchar(max)=cast(ERROR_NUMBER() as nvarchar(max) ), @str_line nvarchar(max)=cast(ERROR_LINE() as nvarchar(max)), @str_proc nvarchar(max)=ERROR_PROCEDURE(), @str_title nvarchar(max)='VERWIJDEREN VAN NIET-RESPONDENDE PROCESSEN OP DE SERVER 'voorbeeld @sqldat.com@servername, @str_pred_mess nvarchar(max)='DE FOUT VAN HET VERWIJDEREN VAN NIET-RESPONDENDE PROCESFOUTEN IS OPGEKOMEN OP DE '[email protected]@servername+' SERVER'; exec [DATABASE_NAME].srv.ErrorInfoIncUpd @ERROR_TITLE =@str_title, @ERROR_PRED_MESSAGE =@str_pred_mess, @ERROR_NUMBER =@str_num, @ERROR_MESSAGE =@str_mess, @ERROSTRINE, @URER =@strOR_MESSAGE ONTVANGERS ='RECIPIENT1;RECIPIENT2'; verklaren @err [email protected]@error; raiserror(@str_mess,16,1);end catch

[/expand]

Hier wordt de opgeslagen procedure svr.KillFullOldConnect gebruikt.

Resultaat

Dit artikel bevat een voorbeeld van het uitbreiden van de functionaliteit van een gewone Database Mail en een voorbeeld van hoe u meldingen in HTML-tabellen kunt genereren en deze vervolgens naar beheerders kunt e-mailen. Met deze aanpak kunnen beheerders in realtime of na een bepaalde tijd beheerders op de hoogte stellen van verschillende problemen, waardoor het optreden van een kritiek probleem en het falen van DBMS en server wordt geminimaliseerd, wat op zijn beurt de productie beschermt tegen vertraging van de workflow.

Referenties:

  1. Sp_send_dbmail
  2. Database-e-mail
  3. Srv.KillFullOldConnect

  1. Mysql_*-functies vervangen door PDO en voorbereide instructies

  2. Overeenkomsten en verschillen tussen RANK-, DENSE_RANK- en ROW_NUMBER-functies

  3. EM12c Database Wachttijd waarschuwingen

  4. Excel-bestanden met variabele headers importeren