Introduktion
Ofta finns det ett behov av att på något sätt informera administratörer om problemen med en server. Aviseringar är generellt uppdelade i två typer:
1) aviseringar i realtid, det vill säga de som måste komma direkt när ett problem uppstår
2) försenade aviseringar, det vill säga de som kommer efter en ganska lång tid (mer än 1 timme) efter att ett problem uppstått.
I mitt arbete var det nödvändigt att utöka funktionaliteten för den vanliga SQL Server Database Mail.
I den här artikeln kommer vi att överväga ett exempel på hur man genererar meddelanden i HTML-tabeller och sedan skickar dem till administratörer.
Lösning
1. Konfigurera Databas Mail
2. Skapa en tabell för mottagare:
[expand title =”Kod”]
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[Recipient]( [Recipient_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Recipient_Name] [nvarchar NOT a NULL, / primär e-postadress](255) Recipient_Code] [nvarchar](10) NOT NULL, // mottagarens kod [IsDeleted] [bit] NOT NULL, // en raderingsindikator (oavsett om en mottagare används eller inte) [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_Recipient ] PRIMARY KEY CLUSTRED ( [Recipient_GUID] ASC)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMANCIETE] (PAD_INDEX =AV, STATISTICS_NORECOMPUTE =AV, IGNORE_DUP_KEY =AV, ALLOW_ROW_LOCKS =PÅ, ALLOW_PAGE_LOCKS =PÅ) PÅ [PRIMÄR], BEGRÄNSNING [AK_Recipient_Name] UNIQUE NONCLUSTERED_Name =[PAD_INDEX OFF] F, IGNORE_DUP_KEY =AV, ALLOW_ROW_LOCKS =PÅ, ALLOW_PAGE_LOCKS =PÅ) PÅ [PRIMÄR]) PÅ [PRIMÄR]MÅLTABELL [srv].[Recipient] LÄGG TILL BEGRÄNSNING [DF_Recipient_Recipient_GUID]sequentiellt [ABGÅTTABEL] TILLBAKA TILLBAKA. srv].[Recipient] LÄGG TILL BEGRÄNSNING [DF_Recipient_IsDeleted] DEFAULT ((0)) FÖR [IsDeleted]MÅLTABELL [srv].[Recipient] LÄGG TILL BEGRÄNSNING [DF_Recipient_InsertUTCDate] DEFAULT (getutcdate()>) FÖR [GÅ in[/expand]3. Skapa en tabell för adresserna till mottagarna:
[expand title =”Kod”]
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[Adress]( [Address_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Recipient_GUID] [uniqueidentifier](] mottagarenvar, mottagarenvar. 255) NOT NULL, // email [IsDeleted] [bit] NOT NULL, // raderingsindikator (oavsett om e-post används eller inte) [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED ( [Address_GUID] ASC )MED (PAD_INDEX =AV, STATISTICS_NORECOMPUTE =AV, IGNORE_DUP_KEY =AV, ALLOW_ROW_LOCKS =PÅ, ALLOW_PAGE_LOCKS =PÅ) PÅ [PRIMÄR], BEGRÄNSNING [AK_Adress] UNIK ANVÄNDARE OCH ANVÄNDARE ([ID] ASCENT_) , STATISTICS_NORECOMPUTE =AV, IGNORE_DUP_KEY =AV, ALLOW_ROW_LOCKS =PÅ, ALLOW_PAGE_LOCKS =PÅ) PÅ [PRIMÄR]) PÅ [PRIMÄR]MÅLTABELL [srv].[Adress] (Adress] (Adress] (ADD) (ADD) ADD_ADRESS DEFAID_ADRESS [ADRESS_ADRESS) (Ny)_GUID Address DEFAid_ MÅLTABELL [ srv].[Adress] LÄGG TILL BEGRÄNSNING [DF_Address_IsDeleted] DEFAULT ((0)) FÖR [IsDeleted]MÅLTABELL [srv].[Adress] LÄGG TILL BEGRÄNSNING [DF_Address_InsertUTCDate] STANDARD (getutcdate()) FÖR [GOdate][/expand]
4. Skapa en tabell för en meddelandekö:
[expand title =”Kod”]
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[ErrorInfo]( [ErrorInfo_GUID] [uniqueidentifier] INTE NULL, [ERROR_TITLE] [nvarchar] (max.] TITEL NULLER, ELLER _ NULLER,RAGE (max) NULL, // preliminär information [ERROR_NUMBER] [nvarchar](max) NULL, // meddelande (fel) kod [ERROR_MESSAGE] [nvarchar](max) NULL, // meddelande [ERROR_LINE] [nvarchar](max) NULL, // radnummer [ERROR_PROCEDURE] [nvarchar](max) NULL, // lagrad procedur [ERROR_POST_MESSAGE] [nvarchar](max) NULL, // förklarande information [RECIPIENTS] [nvarchar](max) NULL, // recipints åtskilda av ';' [InsertDate] [datetime] NOT NULL, [StartDate] [datetime] NOT NULL, // startdata och tid [FinishDate] [datetime] NOT NULL, // slutdatum och tid [Count] [int] NOT NULL, // antal gånger [UpdateDate] [dat etime] NOT NULL, [IsRealTime] [bit] NOT NULL, // realtidsindikator [InsertUTCDate] [datetime] NULL, BEGRÄNSNING [PK_ErrorInfo] PRIMÄRNYCKEL KLUSTERAD ( [ErrorInfo_GUID] ASC) MED (PAD_INDEX =AV, AV, STATISTISK, AV IGNORE_DUP_KEY =AV, ALLOW_ROW_LOCKS =PÅ, ALLOW_PAGE_LOCKS =PÅ) PÅ [PRIMÄR]) PÅ [PRIMÄR] TEXTIMAGE_PÅ [PRIMÄR]MÅLTABELL [srv].[ErrorInfo] ADD CONSTRAINT_GUID]_ErrorInfoInfo)(wide_error) TABELL [srv].[ErrorInfo] LÄGG TILL BEGRÄNSNING [DF_ErrorInfo_InsertDate] DEFAULT (getdate()) FÖR [InsertDate]MÅLTABELL [srv].[ErrorInfo] LÄGG TILL BEGRÄNSNING [DF_ErrorInfo_StartDate] DEFAULT (gettdate() TABLE FOR GO [gettdate() TABLE] srv].[ErrorInfo] LÄGG TILL BEGRÄNSNING [DF_ErrorInfo_FinishDate] DEFAULT (getdate()) FÖR [FinishDate]MÅLTABELL [srv].[ErrorInfo] LÄGG TILL BEGRÄNSNING [DF_ErrorInfo_Count] DEFAULT ((1)) FÖR [RÄKNA]MÅL TILL. .[ErrorInfo] ADD CONSTRAINT [DF__ErrorInfo__Updat__5FFEE747] DEFAU LT (getdate()) FÖR [UpdateDate]MÅLTABELL [srv].[ErrorInfo] LÄGG TILL BEGRÄNSNING [DF_ErrorInfo_IsRealTime] DEFAULT ((0)) FÖR [IsRealTime]MÅLTABELL [srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_IsRealTime] getutcdate()) FÖR [InsertUTCDate]GO[/expand]
5. Skapa en arkivtabell för meddelanden som skickas från meddelandekön:
[expand title =”Kod”]
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[ErrorInfoArchive]( [ErrorInfo_GUID] [uniqueidentifier] ROWGUIDCOL INTE NULL, [ERROR_TITLE](max)RED_charNULL] [nRvarNULL] [nrvarESS_n ) 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] PRIMARY KEY CLUSTERED ( [ErrorInfo_GUID] ASC)EXTH =(PAD_IND STATISTICS_NORECOMPUTE =AV, IGNORE_DUP_KEY =AV, ALLOW_ROW_LOCKS =PÅ, ALLOW_PAGE_LOCKS =PÅ) PÅ [PRIMÄR]) PÅ [PRIMÄR] TEXTIMAGE_ON [PRIMÄR]MÅL R TABELL [srv].[ErrorInfoArchive] LÄGG TILL BEGRÄNSNING [DF_ErrorInfoArchive_ErrorInfo_GUID] DEFAULT (newsequentialid()) FÖR [ErrorInfo_GUID]MÅLTABELL [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_InfoArchive] ADD CONSTRAINT [DF_ArchiveIndate](DerrorInfoArchive)(Datum) [srv].[ErrorInfoArchive] LÄGG TILL BEGRÄNSNING [DF_ErrorInfoArchive_StartDate] DEFAULT (getdate()) FÖR [StartDate]MÅLTABELL [srv].[ErrorInfoArchive] LÄGG TILL BEGRÄNSNING [DF_ErrorInfoArchive_FinishFinishDate] DFAULT (Färddatum) [FALLDAT] [FALLD] ].[ErrorInfoArchive] LÄGG TILL BEGRÄNSNING [DF_ErrorInfoArchive_Count] STANDARD ((1)) FÖR [Count]GOALTER TABELL [srv].[ErrorInfoArchive] LÄGG TILL BEGRÄNSNING [DF_ErrorInfoArchive_UpdateDate] DEFAULT (getdate()] FÖR [GOALrvdate TABLE] [GOALrvdate] [ErrorInfoArchive] LÄGG TILL BEGRÄNSNING [DF_ErrorInfoArchive_IsRealTime] DEFAULT ((0)) FÖR [IsRealTime]MÅLTABELL [srv].[ErrorInfoArchive] LÄGG TILL BEGRÄNSNING [DF_ErrorInfoArchive_InsertUTCDate] STANDARD() FORutatepIndate() (get] re>[/expand]
Denna information behövs för historiken. Dessutom måste denna tabell rensas från mycket gamla data (till exempel äldre än en månad).
6. Skapa en lagrad procedur som registrerar ett nytt meddelande i meddelandekön:
[expand title =”Kod”]
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDUR [srv].[ErrorInfoIncUpd] @ERROR_TITLE nvarchar(max), @ERROR_PRED_MESSAGE nvarchar_NUMBER(max), @rARRORn NUMBER), @ ERRRORn nvarchar(max), @ERROR_PROCEDURE nvarchar(max), @ERROR_POST_MESSAGE nvarchar(max), @RECIPIENTS nvarchar(max), @StartDate datetime=null, @FinishDate datetime=null, @IsRealTime bit =0ASBEGIN /* Felloggning tabell som ska skickas via e-post om tabellen redan har en post med samma titel, innehåll och avsändare, slutdatumet för felet, datumet för postuppdateringen, samt antalet fel kommer att ändras */ SET NOCOUNT PÅ; deklarera @ErrorInfo_GUID unik identifierare; välj topp 1 @ErrorInfo_GUID=ErrorInfo_GUID från srv.ErrorInfo där ([email protected]_TITLE eller @ERROR_TITLE är null) och [email protected] och ([email protected]_MESSAGE eller @[email protected]_TITLE är null) eller @ERROR_PRED_MESSAGE är null) och ([email protected]_POST_MESSAGE eller @ERROR_POST_MESSAGE är null) och ([email protected] eller @IsRealTime är 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 start update srv.ErrorInfo set FinishDate=getdate(), [Count]=[Count]+1, UpdateDate=getdate() där [email protected]_GUID; endENDGO[/expand]
7. Skapa en lagrad procedur som returnerar en sträng från adresserna med koden eller den primära e-postadressen för en mottagare:
[expand title =”Kod”]
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[GetRecipients]@Recipient_Name nvarchar(255)=NULL,@Recipient_Code nvarchar(10)(10)=NUL procedur för @varRecipientmax,/ skapa e-postaviseringar*/AS BÖRJAN STÄLLA IN ANTAL PÅ; set @Recipients=''; välj @[email protected]+d.[Adress]+';' från srv.Recipient som r inre anslut srv.[Adress] som d på r.Recipient_GUID=d.Recipient_GUID där ([email protected]_Name eller @Recipient_Name ÄR NULL) och ([email protected]_Code eller @Recipient_Code) och IS NULL r.IsDeleted=0 och d.IsDeleted=0; --ordning efter r.InsertUTCDate desc, d.InsertUTCDate desc; if(len(@Recipients)>0) set @Recipients=substring(@Recipients,1,len(@Recipients)-1);ENDGO[/expand]
8. Skapa de nödvändiga funktionerna för att arbeta med datum och tid:
[expand title =”Kod”]
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [rep].[GetDateFormat] ( @dt datetime, // input date @format int=0 // förinställt format)RETURNERAR nvarchar(255)s date as/* en sträng enligt angivet format och inmatningsdatum Infogar nollor vid behov:format inmatningsdatum resultat 0 17.4.2014 "17.04.2014" 1 17.4.2014 "04.2014" 1 8.11.2014 "11.2014". */BÖRJA DEKLARERA @res nvarchar(255); DEKLARE @dag int=DAG(@dt); DECLARE @month int=MONTH(@dt); DECLARE @year int=YEAR(@dt); if(@format=0) start set @res=IIF(@day<10,'0'+cast(@day as nvarchar(1)), cast(@day as nvarchar(2)))+'.'; set @[email protected]+IIF(@month<10,'0'+cast(@month as nvarchar(1)), cast(@month as nvarchar(2)))+'.'; ställ in @[email protected]+cast(@år som nvarchar(255)); end else if(@format=1) begin set @res=IIF(@month<10,'0'+cast(@month as nvarchar(1)), cast(@month as nvarchar(2)))+'. '; ställ in @[email protected]+cast(@år som nvarchar(255)); end else if(@format=2) start set @res=cast(@year 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 // förinställt format)RETURNERAR nvarchar/(255)AS tid som en sträng enligt angivet format och inmatningstiden Infogar nollor vid behov:format inmatningstid resultat 0 17:04 "17:04:00" 1 17:04 "17:04" 1 8:04 "08:04 " 2 17:04 "17"*/BÖRJA DEKLARERA @res nvarchar(255); DECLARE @hour int=DATEPART(HOUR, @dt); DECLARE @min int=DATEPART(MINUT, @dt); DECLARE @sec int=DATEPART(SECOND, @dt); if(@format=0) start 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 som nvarchar(1)), cast(@min som nvarchar(2)))+':'; set @[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)))+':'; set @[email protected]+IIF(@min<10,'0'+cast(@min som nvarchar(1)), cast(@min som nvarchar(2))); end else if(@format=2) start set @res=IIF(@hour<10,'0'+cast(@hour as nvarchar(1)), cast(@hour as nvarchar(2))); avsluta RETURN @res;ENDGO[/expand]
9. Skapa en lagrad procedur som skapar en HTML-rapport om meddelanden i form av en tabell:
[expand title =”Kod”]
ANVÄND [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[GetHTMLTable] @recipients nvarchar(max) ,@dt datetime // vid vilket datum som ska läsasASBEGIN /* genererar HTML-SET NOCOUNT tabell */; deklarera @body nvarchar(max); deklarera @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 (max) ,[ERROR_PROCEDURE] nvarchar(max) ,[ERROR_POST_MESSAGE] nvarchar(max) ,[InsertDate] datetime ,[StartDate] datetime ,[FinishDate] datetime ,[Count] int ); deklarera @ID int ,@ERROR_TITLE nvarchar(max) ,@ERROR_PRED_MESSAGE nvarchar(max) ,@ERROR_NUMBER nvarchar(max) ,@ERROR_MESSAGE nvarchar(max) ,@ERROR_LINE nvarchar(max)@nvarCERRORERM (max) ,@InsertDate datetime ,@StartDate datetime ,@FinishDate datetime ,@Count int insert into @tbl( [ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSORAGE]_LINEOR,[ERROR_MESSORAGE]_LINE ,[ERRERERMESSOR] ] _ERTERERM. ] ,[InsertDate] ,[StartDate] ,[FinishDate] ,[Count] ) välj topp 100 [ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSAGE] ,[ERROR_LINE] ,[ERROR_PROCEDURE] ,[ERROR_POST_MESSAGE],[InsertDate],[StartDate],[FinishDate],[Count] från [srv].[ErrorInfo] där ([RECIPIENTS@RECIPIENTS] ) eller (@recipients IS NULL) och InsertDate'; set @example@sqldat.com+' '; set @[email protected]+' '; while((välj topp 1 1 från @tbl)>0) start set @[email protected]+''; set @[email protected]+'№ п/п'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'DATE'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'FEL'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'DESCRIPTION'; set @[email protected]+' '; set @[email protected]+''; ställ in @[email protected]+'FELKOD'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'MEDDELANDE'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'START'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'FINISH'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'NUMMER'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'LINJENUMMER'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'PROCEDUR'; set @[email protected]+' '; set @[email protected]+''; set @[email protected]+'OBS'; set @[email protected]+' '; set @[email protected]+''; välj topp 1 @ID =[ID] ,@ERROR_TITLE =[ERROR_TITLE] ,@ERROR_PRED_MESSAGE=[ERROR_PRED_MESSAGE] ,@ERROR_NUMBER =[ERROR_NUMBER] ,@ERROR_MESSAGE =[ERROR_MESSAGE] ,@ERROR_PRED_MESSAGE=[ERROR_PRED_MESSAGE] ,@ERROR_NUMBER =[ERROR_NUMBER] ,@ERROR_MESSAGE =[ERROR_MESSAGE] ] ,@ERROR_POST_MESSAGE=[ERROR_POST_MESSAGE] ,@InsertDate =[InsertDate] ,@StartDate =[StartDate] ,@FinishDate =[FinishDate] ,@Count =[Count] från @tbl order by InsertDate asc; set @[email protected]+' '; end set @[email protected]+''; välj @body;ENDGO'; ställ in @[email protected]+cast(@ID som nvarchar(max)); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+rep.GetDateFormat(@InsertDate, default)+' '+rep.GetTimeFormat(@InsertDate, default); // cast(@Infoga datum som nvarchar(max)); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+isnull(@ERROR_TITLE,''); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+isnull(@ERROR_PRED_MESSAGE,''); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+isnull(@ERROR_NUMBER,''); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+isnull(@ERROR_MESSAGE,''); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+rep.GetDateFormat(@StartDate, default)+' '+rep.GetTimeFormat(@StartDate, default); //cast(@StartDate som nvarchar(max)); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+rep.GetDateFormat(@FinishDate, default)+' '+rep.GetTimeFormat(@FinishDate, default); //cast(@FinishDate som nvarchar(max)); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+cast(@Count as nvarchar(max)); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+isnull(@ERROR_LINE,''); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+isnull(@ERROR_PROCEDURE,''); set @[email protected]+' '; set @[email protected]+''; set @[email protected]+isnull(@ERROR_POST_MESSAGE,''); set @[email protected]+' '; radera från @tbl där [email protected]; set @[email protected]+'[/expand]
10. Skapa en lagrad procedur som skickar meddelanden:
[expand title =”Kod”]
ANVÄND [DATABAE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[RunErrorInfoProc] @IsRealTime bit =0 // skicka läge (1-realtid)ASBEGIN /* skicka felmeddelanden med det angivna läget */ SET NOCOUNT; deklarera @dt datetime=getdate(); deklarera @tbl-tabell(Mottagare nvarchar(max)); deklarera @mottagare nvarchar(max); deklarera @mottagare nvarchar(255); deklarera @result nvarchar(max)=''; deklarera @recp nvarchar(max); deklarera @ind int; deklarera @recipients_key nvarchar(max); // ta emot alla nödvändiga meddelanden infoga i @tbl(Recipients) välj [RECIPIENTS] från srv.ErrorInfo där InsertDate0) start //receive recipients select top (1) @recipients=Recipients from @tbl; set @[email protected]; ställ in @result=''; // för varje mottagare while(len(@recipients)>0) start set @ind=CHARINDEX(';', @recipients); if(@ind>0) start set @recipient=substring(@recipients,1, @ind-1); set @recipients=substring(@recipients,@ind+1,len(@recipients)[email protected]); end else start set @[email protected]; set @recipients=''; slutet; // ta emot mottagarens e-postmeddelande exec [srv].[GetRecipients] @[email protected], @[email protected] out; if(len(@recp)=0) start exec [srv].[GetRecipients] @[email protected], @[email protected] ut; if(len(@recp)=0) set @[email protected]; slut // separerade med symbolen ';' set @[email protected]@sqldat.com+';'; slutuppsättning @resultat=delsträng(@resultat,1,len(@resultat)-1); set @[email protected]; // ta emot HTML-rapport med de angivna mottagarna och datuminfogning i @rec_body(Body) exec srv.GetHTMLTable @[email protected]_key, @[email protected]; // ta emot HTML-rapport välj topp (1) @body=Body från @rec_body; // den faktiska sändande EXEC msdb.dbo.sp_send_dbmail // e-postadmin profil vi skapade @profile_name ='ALARM', //mottagarens e-post @recipients =@recipients, // text of a message @body =@body, // Ämne @subject =N'INFORMATION OM UTFÖRANDEFEL', @body_format='HTML'--, // Låt oss till exempel lägga till resultatet av en slumpmässig SQL-fråga i meddelandet [email protected] =@query--'SELECT TOP 10 namn FRÅN sys.objects'; ta bort från @tbl där [email protected]_key; radera från @rec_body; slut // arkivera de skickade meddelandena 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] POS. MOTTAGARE] ,[StartDate] ,[FinishDate] ,[Count] ,IsRealTime ) VÄLJ [ErrorInfo_GUID] ,[ERROR_TITLE],[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER],[ERROR_MESSAGE]_LINE ELLER,[ERROR_MESSERAGE]_LINE ELLER,[ERROR_ER, ELLER, [RECIPIENTS] ,[StartDate] ,[FinishDate] ,[Count] ,IsRealTime FROM [srv].[ErrorInfo] där [email protected] och InsertDate [/expand]
Denna lagrade procedur tar varje meddelande från meddelandekön och lindar in det i en HTML-rapport i form av en tabell. För mottagare, baserat på deras kod eller primära e-postadress, skapar den en sträng som består av e-postadresser som ett meddelande skickas till. På så sätt behandlas alla valda meddelanden. Här används den lagrade proceduren msdb.dbo.sp_send_dbmail.
11. Skapa två uppgifter i Agent (den första är för aviseringar i realtid (schemalägg 1 gång per minut), den andra är för enkla aviseringar (schemalägg 1 gång per timme)). Lägg till följande till koden för uppgiften:
EXEKUTERA [DATABASE_NAME].[srv].[RunErrorInfoProc] @IsRealTime=0; // 0 - för enkla meddelanden och 1 - för realtidsmeddelandenHär är ett exempel på felrapportering:
[expand title="Kod"]
begyn try exec [DATABASE_NAME].[srv].[KillFullOldConnect];end trybegin catch deklarera @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)='RADERA PROCESSER SOM INTE SVARAR PÅ SERVERN 'exempel @sqldat.com@servername, @str_pred_mess nvarchar(max)='FEL FÖR RADERING AV ICKE-SVARANDE PROCESSER UPPFÖDES PÅ SERVERN '[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_LINEDUREER =@strOR_MESS,TrOR_MESSAGE =@strOR_MESS, @ERROR_LINEER,TURREER, RECIPIENTS ='RECIPIENT1;RECIPIENT2'; förklara @err [email protected]@error; raiserror(@str_mess,16,1);end catch[/expand]
Här används den lagrade proceduren svr.KillFullOldConnect.
Resultat
Den här artikeln innehåller ett exempel på hur man utökar funktionaliteten för en vanlig databaspost och ett exempel på hur man genererar meddelanden i HTML-tabeller och sedan e-postar dem till administratörer. Detta tillvägagångssätt gör det möjligt att meddela administratörer om olika problem i realtid eller efter en viss tid, och därigenom minimera förekomsten av ett kritiskt problem och fel på DBMS och server, vilket i sin tur skyddar produktionen från arbetsflödesförseningar.
Referenser:
- Sp_send_dbmail
- Database-post
- Srv.KillFullOldConnect