Introduktion
Ofte er der behov for på en eller anden måde at informere administratorer om problemerne med en server. Notifikationer er generelt opdelt i 2 typer:
1) meddelelser i realtid, dvs. dem, der skal komme med det samme, når der opstår et problem
2) forsinkede underretninger, dvs. dem, der kommer efter ret lang tid (mere end 1 time) efter et problem opstår.
I mit arbejde var det nødvendigt at udvide funktionaliteten af den almindelige SQL Server Database Mail.
I denne artikel vil vi overveje et eksempel på, hvordan man genererer meddelelser i HTML-tabeller og derefter sender dem til administratorer.
Løsning
1. Konfigurer Database Mail
2. Opret en tabel til modtagere:
[expand title =”Kode”]
BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABEL [srv].[Recipient]( [Recipient_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Recipient_Name] [nvarchar NOT](255)/ primær modtager Recipient_Code] [nvarchar](10) NOT NULL, // modtagerens kode [IsDeleted] [bit] NOT NULL, // en sletningsindikator (uanset om en modtager bruges eller ej) [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_Recipient ] PRIMÆR NØGLE KLUSTERET ( [Recipient_GUID] ASC)MED (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKS =TIL, ALLOW_PAGE_LOCKS =TILSLÅT_], CONTENT [ANVENDT_KONTENDERT] PÅ [PRIMAKODE] (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKS =TIL, ALLOW_PAGE_LOCKS =TIL) PÅ [PRIMÆR], BEGRÆNSNING [AK_Recipient_Name] UNIQUE NONCLUSTERED_Name =[PAD_INDEX =ON] F, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKS =TIL, ALLOW_PAGE_LOCKS =TIL) PÅ [PRIMÆR]) PÅ [PRIMÆR]MÅLTABEL [srv].[Modtager] TILFØJ BEGRÆNSNING [DF_Recipient_Recipient_GUID] følgende [ABGÅENDE] DEFAULTIDT. srv].[Recipient] TILFØJ BEGRÆNSNING [DF_Recipient_IsDeleted] STANDARD ((0)) FOR [IsDeleted]MÅLTABEL [srv].[Recipient] TILFØJ BEGRÆNSNING [DF_Recipient_InsertUTCDate] DEFAULT (getutcdate()>) FOR [Insert][/expand]
3. Opret en tabel for adresser på modtagerne:
[expand title =”Kode”]
BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABEL [srv].[Adresse]( [Address_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Recipient_GUID] [uniqueidentifier](] recipientnvar,char 255) NOT NULL, // email [Er slettet] [bit] NOT NULL, // sletningsindikator (uanset om e-mail bruges eller ej) [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_Address] PRIMÆR NØGLE KLYNGET ( [Address_GUID] ASC )MED (PAD_INDEX =FRA, STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKS =TIL, ALLOW_PAGE_LOCKS =TIL) PÅ [PRIMÆR], BEGRÆNSNING [AK_Adresse] UNIK IKKE ASCLUSTERET_ADRESSE, INDPADSE ([Recipient_) , STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKS =TIL, ALLOW_PAGE_LOCKS =TIL) PÅ [PRIMÆR]) PÅ [PRIMÆR]MÅLTABEL [srv].[Adresse] (ADRESSE] (ADRESSE) (ADRESSE) (ADRESSE) (ID) ADRESSE DEFALT_ADRESSE(ID)ADRESSE DEFAID_GUIDE MÅLDERTABEL [ srv].[Adresse] TILFØJ BEGRÆNSNING [DF_Address_IsDeleted] STANDARD ((0)) FOR [IsDeleted]GOALTER TABEL [srv].[Adresse] TILFØJ BEGRÆNSNING [DF_Address_InsertUTCDate] STANDARD (getutcdate()) FOR [GOInsert][/expand]
4. Opret en tabel til en beskedkø:
[expand title =”Kode”]
BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[ErrorInfo]( [ErrorInfo_GUID] [uniqueidentifier] IKKE NULL, [ERROR_TITLE] [nvarchar](max]/eller) title NULLER,RAGE (maks.) NULL, // foreløbige oplysninger [ERROR_NUMBER] [nvarchar](maks.) NULL, // meddelelse (fejl) kode [ERROR_MESSAGE] [nvarchar](max) NULL, // meddelelse [ERROR_LINE] [nvarchar](max) NULL, // linjenummer [ERROR_PROCEDURE] [nvarchar](maks.) NULL, // lagret procedure [ERROR_POST_MESSAGE] [nvarchar](max) NULL, // forklarende oplysninger [REIPIENTER] [nvarchar](max) NULL, // modtagere adskilt af ';' [InsertDate] [datetime] NOT NULL, [StartDate] [datetime] NOT NULL, // startdata og tid [FinishDate] [datetime] NOT NULL, // slutdato og klokkeslæt [Count] [int] NOT NULL, // antal gange [UpdateDate] [dat etime] IKKE NULL, [IsRealTime] [bit] IKKE NULL, // realtidsindikator [InsertUTCDate] [datetime] NULL, BEGRÆNSNING [PK_ErrorInfo] PRIMÆR NØGLE KLUSTERET ( [ErrorInfo_GUID] ASC) MED (PAD_INDEX =OFF =OFF, STATORE IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]MÅLTABEL [srv].[ErrorInfo] ADD CONSTRAINT [DF]_Error_Info. TABEL [srv].[ErrorInfo] TILFØJ BEGRÆNSNING [DF_ErrorInfo_InsertDate] STANDARD (getdate()) FOR [InsertDate]GOALTER TABEL [srv].[ErrorInfo] TILFØJ BEGRÆNSNING [DF_ErrorInfo_StartDate] STANDARD (getdato() TABLE] [Getdato TAB] srv].[ErrorInfo] TILFØJ BEGRÆNSNING [DF_ErrorInfo_FinishDate] STANDARD (getdate()) FOR [FinishDate]GOALTER TABLE [srv].[ErrorInfo] TILFØJ BEGRÆNSNING [DF_ErrorInfo_Count] STANDARD ((1)) FOR [Tælle]MÅL TABLE [srv]. .[ErrorInfo] ADD CONSTRAINT [DF__ErrorInfo__Updat__5FFEE747] DEFAU LT (getdate()) FOR [UpdateDate]GOALTER TABEL [srv].[ErrorInfo] TILFØJ BEGRÆNSNING [DF_ErrorInfo_IsRealTime] DEFAULT ((0)) FOR [IsRealTime]MÅLTERTABEL [srv].[ErrorInfo] TILFØJ BEGRÆNSNING [DF_ErrorInfo_IsRealTime] getutcdate()) FOR [InsertUTCDate]GO[/expand]
5. Opret en arkivtabel for beskeder sendt fra beskedkøen:
[expand title =”Kode”]
BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABEL [srv].[ErrorInfoArchive]( [ErrorInfo_GUID] [uniqueidentifier] ROWGUIDCOL IKKE NULL, [ERROR_TITLE](maks._TITLE](maks.)Par NULL) [Mr. ) 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] IKKE NULL, [UpdateDate] [datetime] NOT NULL, [IsRealTime] [bit] NOT NULL, [InsertUTCDate] [datetime] NULL, BEGRÆNSNING [PK_ArchiveErrorInfo] PRIMÆR NØGLE KLUNDET ( [ErrorInfo_GUID] ASC)EXTH =(PAD_IND STATISTICS_NORECOMPUTE =FRA, IGNORE_DUP_KEY =FRA, ALLOW_ROW_LOCKS =TIL, ALLOW_PAGE_LOCKS =TIL) PÅ [PRIMÆR]) PÅ [PRIMÆR] TEXTIMAGE_ON [PRIMÆR]MÅL R TABLE [srv].[ErrorInfoArchive] TILFØJ BEGRÆNSNING [DF_ErrorInfoArchive_ErrorInfo_GUID] STANDARD (newsequentialid()) FOR [ErrorInfo_GUID]MÅLTABEL [srv].[ErrorInfoArchive] TILFØJ KONSTRAINT [DerrorInfoArchive] TILFØJ KONSTRAINT [DF_ArchiveInDate]TFaRgetDataBernData(Dato)(Dato) [srv].[ErrorInfoArchive] TILFØJ BEGRÆNSNING [DF_ErrorInfoArchive_StartDate] DEFAULT (getdate()) FOR [StartDate]GOALTER TABEL [srv].[ErrorInfoArchive] TILFØJ BEGRÆNSNING [DF_ErrorInfoArchive_FinishFinishDate] TFAULT (Fulddato) [FAB] FORBUDDato() ].[ErrorInfoArchive] TILFØJ BEGRÆNSNING [DF_ErrorInfoArchive_Count] STANDARD ((1)) FOR [Count]GOALTER TABEL [srv].[ErrorInfoArchive] TILFØJ BEGRÆNSNING [DF_ErrorInfoArchive_UpdateDate] DEFAULT (getdate())] FOR [GOALrvDate] [ErrorInfoArchive] TILFØJ BEGRÆNSNING [DF_ErrorInfoArchive_IsRealTime] STANDARD ((0)) FOR [IsRealTime]GOALTER TABEL [srv].[ErrorInfoArchive] TILFØJ BEGRÆNSNING [DF_ErrorInfoArchive_InsertUTCDate] STANDARD[/expand]
Disse oplysninger er nødvendige for historikken. Desuden skal denne tabel ryddes fra meget gamle data (f.eks. ældre end en måned).
6. Opret en lagret procedure, der registrerer en ny besked i beskedkøen:
[expand title =”Kode”]
BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[ErrorInfoIncUpd] @ERROR_TITLE nvarchar(max), @ERROR_PRED_MESSAGE nvarchar_NUMBER(max), @nERRORnESS), @nERRORn nvarchar(max), @ERROR_PROCEDURE nvarchar(max), @ERROR_POST_MESSAGE nvarchar(max), @RECIPIENTS nvarchar(max), @StartDate datetime=null, @FinishDate datetime=null, @IsRealTime bit =0ASBEGIN /* Fejllogning tabel, der skal sendes via e-mail, hvis tabellen allerede har en post med samme titel, indhold og afsender, vil slutdatoen for fejlen, datoen for postopdateringen samt antallet af fejl ændres */ SET NOCOUNT. PÅ; erklær @ErrorInfo_GUID unikt id; vælg top 1 @ErrorInfo_GUID=ErrorInfo_GUID fra srv.ErrorInfo hvor ([email protected]_TITLE eller @ERROR_TITLE er nul) og [email protected] og ([email protected]_MESSAGE eller @[email protected]_TITLE er null) ([email protected]_MESSAGE er null) eller @ERROR_PRED_MESSAGE er null) og ([email protected]_POST_MESSAGE eller @ERROR_POST_MESSAGE er null) og ([email protected] eller @IsRealTime er null); if (@ErrorInfo_Guid er null) Begynd indsæt i srv.errorinfo (error_title, error_pred_message, error_number, error_message, error_line, error_procedure, error_post_message, modtagere, isrealtime, startdate, finishdate) select @error_title,@error_prched_mess_message,@elecros,@elecros,@elecros,@fejl_numb ERROR_LINE ,@ERROR_PROCEDURE ,@ERROR_POST_MESSAGE ,@RECIPIENTS ,@IsRealTime ,isnull(@StartDate, getdate()) ,isnull(@FinishDate,getdate()) end else start update srv.ErrorInfo set FinishDate=getdate(), [Count]=[Count]+1, UpdateDate=getdate() hvor [email protected]_GUID; endENDGO[/expand]
7. Opret en lagret procedure, der returnerer en streng fra adresserne med koden eller den primære e-mail-adresse på en modtager:
[expand title =”Kode”]
BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[GetRecipients]@Recipient_Name nvarchar(255)=NULL,@Recipient_Code nvarchar(10)(10)=NULL,/nvarRecipients) procedure for oprettelse af e-mail-notifikationer*/ASBEGIN SÆT ANTAL TIL; sæt @Recipients=''; vælg @[email protected]+d.[Adresse]+';' fra srv.Recipient som r indre join srv.[Adresse] som d på r.Recipient_GUID=d.Recipient_GUID hvor ([email protected]_Name eller @Recipient_Name ER NULL) og ([email protected]_Code eller @Recipient_Code ER NULL) r.IsDeleted=0 og d.IsDeleted=0; --order efter r.InsertUTCDate desc, d.InsertUTCDate desc; if(len(@Recipients)>0) set @Recipients=substring(@Recipients,1,len(@Recipients)-1);ENDGO[/expand]
8. Opret de nødvendige funktioner til at arbejde med datoer og klokkeslæt:
[expand title =”Kode”]
BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [rep].[GetDateFormat] ( @dt datetime, // input date @format int=0 // forudindstillet format)RETURNERER nvarchar(255)AS/* Returnerer date as/* en streng i henhold til det angivne format og indtastningsdatoen Indsætter nuller, hvor det er nødvendigt:format indtastningsdato resultat 0 17.4.2014 "17.04.2014" 1 17.4.2014 "04.2014" 1 8.11.2014 "11.2014" 4.10714" 2.10714" */BEGIN DECLARE @res nvarchar(255); DEKLARE @dag int=DAG(@dt); DECLARE @month int=MONTH(@dt); DECLARE @year int=YEAR(@dt); if(@format=0) start sæt @res=IIF(@dag<10,'0'+cast(@dag som nvarchar(1)), cast(@dag som nvarchar(2)))+'.'; sæt @[email protected]+IIF(@month<10,'0'+cast(@month as nvarchar(1)), cast(@month as nvarchar(2)))+'.'; sæt @[email protected]+cast(@år som nvarchar(255)); end else if(@format=1) start sæt @res=IIF(@month<10,'0'+cast(@month as nvarchar(1)), cast(@month as nvarchar(2)))+'. '; sæt @[email protected]+cast(@år som nvarchar(255)); end else if(@format=2) start sæt @res=cast(@år som nvarchar(255)); end RETURN @res;ENDGOUSE [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [rep].[GetTimeFormat] ( @dt datetime, // input time @format int=0 // preset format)RETURNER nvarchar/* Returnerer nvarchar/(255)AS tid som en streng i henhold til det angivne format og inputtiden Indsætter nuller, hvor det er nødvendigt:format input time resultat 0 17:04 "17:04:00" 1 17:04 "17:04" 1 8:04 "08:04 " 2 17:04 "17"*/BEGIN DECLARE @res nvarchar(255); DEKLARE @time int=DATODEL(TIME, @dt); DEKLARE @min int=DATODEL(MINUT, @dt); DECLARE @sec int=DATEPART(SECOND, @dt); if(@format=0) start sæt @res=IIF(@time<10,'0'+cast(@time som nvarchar(1)), cast(@time som nvarchar(2)))+':'; sæt @[email protected]+IIF(@min<10,'0'+cast(@min som nvarchar(1)), cast(@min som nvarchar(2)))+':'; sæt @[email protected]+IIF(@sec<10,'0'+cast(@sec as nvarchar(1)), cast(@sec as nvarchar(2))); end else if(@format=1) start set @res=IIF(@hour<10,'0'+cast(@hour as nvarchar(1)), cast(@hour as nvarchar(2)))+':'; sæt @[email protected]+IIF(@min<10,'0'+cast(@min som nvarchar(1)), cast(@min som nvarchar(2))); end else if(@format=2) start sæt @res=IIF(@time<10,'0'+cast(@time som nvarchar(1)), cast(@time som nvarchar(2))); ende RETURN @res;ENDGO[/expand]
9. Opret en lagret procedure, der opretter en HTML-rapport om meddelelser i form af en tabel:
[expand title =”Kode”]
BRUG [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[GetHTMLTable] @recipients nvarchar(max) ,@dt datetime // inden for hvilken dato der skal læsesASBEGIN /* genererer HTML-SET NOCOUNT ON */; erklære @body nvarchar(max); erklær @tbl table(ID int identitet(1,1) ,[ERROR_TITLE] nvarchar(max) ,[ERROR_PRED_MESSAGE] nvarchar(max) ,[ERROR_NUMBER] nvarchar(max) ,[ERROR_MESSAGE] nvarchar(max) ][ERROR (max) ,[ERROR_PROCEDURE] nvarchar(max) ,[ERROR_POST_MESSAGE] nvarchar(max) ,[InsertDate] datetime ,[StartDate] datetime ,[FinishDate] datetime ,[Count] int ); erklær @ID int ,@ERROR_TITLE nvarchar(max) ,@ERROR_PRED_MESSAGE nvarchar(maks) ,@ERROR_NUMBER nvarchar(max) ,@ERROR_MESSAGE nvarchar(max) ,@ERROR_LINE nvarchar(max)@nvarCar_RESSORM (max) ,@InsertDate datetime ,@StartDate datetime ,@FinishDate datetime ,@Count int insert into @tbl( [ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSORAGE]_LINE_OR,[ERROR_MESSORAGE]_LINE,[ERROR,DURER, ] ,[InsertDate] ,[StartDate] ,[FinishDate] ,[Count] ) vælg top 100 [ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSAGE] ,[ERROR_LINE] ,[ERROR_PROCEDURE] ,[ERROR_POST_MESSAGE],[InsertDate],[StartDate] ,[FinishDate] ,[Count] fra [srv].[ErrorInfo] hvor ([RECIPIENTS@RECIPIENTS] ) eller (@recipients IS NULL) og InsertDate'; sæt @eksempel@sqldat.com+' '; sæt @[email protected]+' '; while((vælg top 1 1 fra @tbl)>0) start set @[email protected]+''; sæt @[email protected]+'№ п/п'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'DATE'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'FEJL'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'DESCRIPTION'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'FEJLKODE'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'BESKED'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'START'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'FINISH'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'NUMMER'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'LINJENUMMER'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'PROCEDURE'; sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+'BEMÆRK'; sæt @[email protected]+' '; sæt @[email protected]+''; vælg top 1 @ID =[ID] ,@ERROR_TITLE =[ERROR_TITLE] ,@ERROR_PRED_MESSAGE=[ERROR_PRED_MESSAGE] ,@ERROR_NUMBER =[FEJL_NUMMER] ,@ERROR_MESSAGE =[FEJL_MEDDELELSE] ,@ERROR_MESSORER_LINE,[ERROR_MESSAGE] ,@ERROR_MESSOR_LINE,[ERROR_MESSOR] ,@ERROR_MESSOR_LINE,[ERROR_ERERER] ] ,@ERROR_POST_MESSAGE=[ERROR_POST_MESSAGE] ,@InsertDate =[InsertDate] ,@StartDate =[StartDate] ,@FinishDate =[FinishDate] ,@Count =[Count] fra @tbl rækkefølge efter InsertDate asc; sæt @[email protected]+' '; slutsæt @[email protected]+''; vælg @body;ENDGO'; sæt @[email protected]+cast(@ID som nvarchar(max)); sæt @[email protected]+' '; sæt @[email protected]+''; set @[email protected]+rep.GetDateFormat(@InsertDate, default)+' '+rep.GetTimeFormat(@InsertDate, default); // cast(@InsertDate som nvarchar(max)); sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+isnull(@ERROR_TITLE,''); sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+isnull(@ERROR_PRED_MESSAGE,''); sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+isnull(@FEJL_NUMMER,''); sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+isnull(@ERROR_MESSAGE,''); sæt @[email protected]+' '; sæt @[email protected]+''; set @[email protected]+rep.GetDateFormat(@StartDate, default)+' '+rep.GetTimeFormat(@StartDate, default); //cast(@StartDate som nvarchar(max)); sæt @[email protected]+' '; sæt @[email protected]+''; set @[email protected]+rep.GetDateFormat(@FinishDate, default)+' '+rep.GetTimeFormat(@FinishDate, default); //cast(@FinishDate som nvarchar(max)); sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+cast(@Count as nvarchar(max)); sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+isnull(@ERROR_LINE,''); sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+isnull(@ERROR_PROCEDURE,''); sæt @[email protected]+' '; sæt @[email protected]+''; sæt @[email protected]+isnull(@ERROR_POST_MESSAGE,''); sæt @[email protected]+' '; slet fra @tbl hvor [email protected]; sæt @[email protected]+'[/expand]
10. Opret en lagret procedure, der sender beskeder:
[expand title =”Kode”]
BRUG [DATABAE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[RunErrorInfoProc] @IsRealTime bit =0 // sendetilstand (1-realtid)ASBEGIN /* send fejlmeddelelser med den angivne tilstand */ INDSTIL NOCOUNT.; erklær @dt datetime=getdate(); erklær @tbl tabel(Modtagere nvarchar(max)); erklære @recipients nvarchar(max); erklær @recipient nvarchar(255); erklær @result nvarchar(max)=''; erklære @recp nvarchar(max); erklære @ind int; erklær @recipients_key nvarchar(max); // modtage alle de nødvendige beskeder indsæt i @tbl(Recipients) vælg [RECIPIENTS] fra srv.ErrorInfo hvor InsertDate0) start //modtag modtagere vælg top (1) @recipients=Modtagere fra @tbl; sæt @[email protected]; sæt @result=''; // for hver modtager while(len(@recipients)>0) start set @ind=CHARINDEX(';', @recipients); if(@ind>0) startsæt @recipient=substring(@recipients,1, @ind-1); sæt @recipients=substring(@recipients,@ind+1,len(@recipients)[email protected]); end else start set @[email protected]; sæt @recipients=''; ende; // modtag modtagere-mails exec [srv].[GetRecipients] @[email protected], @[email protected] out; if(len(@recp)=0) start exec [srv].[GetRecipients] @[email protected], @[email protected] out; if(len(@recp)=0) sæt @[email protected]; ende // adskilt af symbolet ';' sæt @[email protected]@sqldat.com+';'; slutsæt @resultat=understreng(@resultat,1,len(@resultat)-1); sæt @[email protected]; // modtag HTML-rapport med de angivne modtagere og datoindsættelse i @rec_body(Body) exec srv.GetHTMLTable @[email protected]_key, @[email protected]; // modtag HTML-rapport vælg top (1) @body=Body fra @rec_body; // den faktiske afsendende EXEC msdb.dbo.sp_send_dbmail // e-mail admin profil vi oprettede @profile_name ='ALARM', //recipient email @recipients =@recipients, // text of a message @body =@body, // Emne @subject =N'INFORMATION OM UDFØRELSESFEJL', @body_format='HTML'--, // Lad os f.eks. tilføje resultaterne af en tilfældig SQL-forespørgsel til meddelelsen [email protected] =@query--'SELECT TOP 10 navn FRA sys.objekter'; slet fra @tbl hvor [email protected]_key; slet fra @rec_body; end // arkiver de sendte meddelelser INSERT INTO [srv].[ErrorInfoArchive] ([ErrorInfo_GUID] ,[ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSAGE] ,[ERROR_MESSAGE] ,[ERROR_MESSAGE] ,[ERROR_MESSAGE] ,[ERROR_MESSAGE] ,[ERROR_MESSAGE] ,[ERROR_MESSAGE] ,[ERROR_MESSAGE]_OR] ,[DUERRRESSAGE]_ ,[TERRRESSAGE] RECIPIENTS] ,[StartDate] ,[FinishDate] ,[Count] ,IsRealTime ) VÆLG [ErrorInfo_GUID] ,[ERROR_TITLE],[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSERAGE]_LINE]_ERTER,[ERROR_MESSERAGE]_LINE]_ERTER,[ERER, [RECIPIENTS] ,[StartDate] ,[FinishDate] ,[Count] ,IsRealTime FROM [srv].[ErrorInfo] hvor [email protected] og InsertDate [/expand]
Denne lagrede procedure tager hver besked fra beskedkøen og omslutter den i en HTML-rapport i form af en tabel. For modtagere, baseret på deres kode eller primære e-mailadresse, opretter den en streng bestående af e-mailadresser, som en besked sendes til. På denne måde behandles alle de valgte beskeder. Her bruges den gemte procedure msdb.dbo.sp_send_dbmail.
11. Opret to opgaver i Agent (den første er til notifikationer i realtid (planlæg 1 gang i minuttet), den anden er til simple notifikationer (planlæg 1 gang i timen)). Tilføj følgende til opgavens kode:
UDFØR [DATABASE_NAME].[srv].[RunErrorInfoProc] @IsRealTime=0; // 0 - for simple beskeder og 1 - for realtidsmeddelelserHer er et eksempel på fejlrapportering:
[expand title="Kode"]
begynd try exec [DATABASE_NAME].[srv].[KillFullOldConnect];end trybegin catch erklærer @str_mess nvarchar(max)=ERROR_MESSAGE(), @str_num nvarchar(max)=cast(ERROR_NUMBER() som nvarchar(max) ), @str_line nvarchar(max)=cast(ERROR_LINE() som nvarchar(max)), @str_proc nvarchar(max)=ERROR_PROCEDURE(), @str_title nvarchar(max)='SLETNING AF IKKE-SVARENDE PROCESSER PÅ SERVEREN 'eksempel @sqldat.com@servername, @str_pred_mess nvarchar(max)='SLETNING AF IKKE-SVARENDE PROCESSER FEJL OPSTÅET PÅ SERVEREN '[email protected]@servername+'; exec [DATABASE_NAME].srv.ErrorInfoIncUpd @ERROR_TITLE =@str_title, @ERROR_PRED_MESSAGE =@str_pred_mess, @ERROR_NUMBER =@str_num, @ERROR_MESSAGE =@str_mess, @ERROR_LINEDURE =@strOR_MESS, @ERROR_LINEER,TURRE =@strOR_MESS, RECIPIENTS ='RECIPIENT1;RECIPIENT2'; erklære @err [email protected]@error; raiserror(@str_mess,16,1);end catch[/expand]
Her bruges den lagrede procedure for svr.KillFullOldConnect.
Resultat
Denne artikel indeholder et eksempel på udvidelse af funktionaliteten af en almindelig databasemail og et eksempel på, hvordan man genererer meddelelser i HTML-tabeller og derefter e-mailer dem til administratorer. Denne tilgang giver mulighed for at underrette administratorer om forskellige problemer i realtid eller efter en vis tid, og derved minimere forekomsten af et kritisk problem og fejl i DBMS og server, hvilket igen beskytter produktionen mod forsinkelse af arbejdsgangen.
Referencer:
- Sp_send_dbmail
- Database-mail
- Srv.KillFullOldConnect