多くの場合、サーバーの問題について管理者に何らかの方法で通知する必要があります。通知は一般的に2つのタイプに分けられます:
1)リアルタイムの通知、つまり問題が発生したときにすぐに通知する必要がある通知
2)遅延通知、つまり、問題が発生してからかなり長い時間(1時間以上)後に通知が届きます。
私の仕事では、通常のSQLServerデータベースメールの機能を拡張する必要がありました。
この記事では、HTMLテーブルで通知を生成し、それを管理者に送信する方法の例を検討します。
1。データベースメールの構成
2。受信者用のテーブルを作成します:
[expand title =” 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、//受信者のプライマリメール[ Recipient_Code] [nvarchar](10)NOT NULL、//受信者のコード[IsDeleted] [bit] NOT NULL、//削除インジケーター(受信者が使用されているかどうか)[InsertUTCDate] [datetime] NOT NULL、CONSTRAINT [PK_Recipient ] PRIMARY KEY CLUSTERED([Recipient_GUID] ASC)WITH(PAD_INDEX =OFF、STATISTICS_NORECOMPUTE =OFF、IGNORE_DUP_KEY =OFF、ALLOW_ROW_LOCKS =ON、ALLOW_PAGE_LOCKS =ON)ON [PRIMARY]、CONSTRAINT [AK_Recipient_Code] UNIQUE (PAD_INDEX =OFF、STATISTICS_NORECOMPUTE =OFF、IGNORE_DUP_KEY =OFF、ALLOW_ROW_LOCKS =ON、ALLOW_PAGE_LOCKS =ON)ON [PRIMARY]、CONSTRAINT [AK_Recipient_Name] UNIQUE NONCLUSTERED([Recipient_Name] ASC)WITH(PAD_INDEX =F、IGNORE_DUP_KEY =OFF、ALLOW_ROW_LOCKS =ON、ALLOW_PAGE_LOCKS =ON)ON [PRIMARY])ON [PRIMARY] GOALTERTABLE[srv]。[Recipient]ADDCONSTRAINT [DF_Recipient_Recipient_GUID] DEFAULT(newsequentialid())FOR [Recipient_GUID srv]。[Recipient]ADDCONSTRAINT [DF_Recipient_IsDeleted] DEFAULT((0))FOR [IsDeleted] GOALTERTABLE[srv]。[Recipient]ADDCONSTRAINT [DF_Recipient_InsertUTCDate] DEFAULT(getutcdate())FOR [InsertUTCDate] GO[/ expand]
3。受信者のアドレスのテーブルを作成します:
[expand title =” Code”]
USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]。[Address]([Address_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL、[Recipient_GUID] [uniqueidentifier] NOT NULL、//受信者[Address] [nvarchar]( 255)NOT NULL、//電子メール[IsDeleted][ビット]NOT NULL、//削除インジケーター(電子メールが使用されているかどうか)[InsertUTCDate] [datetime] NOT NULL、CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED([Address_GUID] ASC )WITH(PAD_INDEX =OFF、STATISTICS_NORECOMPUTE =OFF、IGNORE_DUP_KEY =OFF、ALLOW_ROW_LOCKS =ON、ALLOW_PAGE_LOCKS =ON)ON [PRIMARY]、CONSTRAINT [AK_Address] UNIQUE NONCLUSTERED([Recipient_GUID] ASC、[Address] ASC)WITH 、STATISTICS_NORECOMPUTE =OFF、IGNORE_DUP_KEY =OFF、ALLOW_ROW_LOCKS =ON、ALLOW_PAGE_LOCKS =ON)ON [PRIMARY])ON [PRIMARY] GOALTERTABLE[srv]。[Address]ADDCONSTRAINT [DF_Address_Address_GUID] DEFAULT(newsequentialid())ゴールターテーブル[ srv]。[Address]ADDCONSTRAINT [DF_Address_IsDeleted] DEFAULT((0))FOR [IsDeleted] GOALTERTABLE[srv]。[Address]ADDCONSTRAINT [DF_Address_InsertUTCDate] DEFAULT(getutcdate())FOR [InsertUTCDate] GO[/ expand]
4。メッセージキューのテーブルを作成します:
[expand title =” Code”]
USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]。[ErrorInfo]([ErrorInfo_GUID] [uniqueidentifier] NOT NULL、[ERROR_TITLE] [nvarchar](max)NULL、//タイトル[ERROR_PRED_MESSAGE] [nvarchar] (max)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] [dat etime] NOT NULL、[IsRealTime] [bit] NOT NULL、//リアルタイムインジケーター[InsertUTCDate] [datetime] NULL、CONSTRAINT [PK_ErrorInfo] PRIMARY KEY CLUSTERED([ErrorInfo_GUID] ASC)WITH(PAD_INDEX =OFF、STATISTICS_NORECOMPUTE =OFF、 IGNORE_DUP_KEY =OFF、ALLOW_ROW_LOCKS =ON、ALLOW_PAGE_LOCKS =ON)ON [PRIMARY])ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GOALTERTABLE[srv]。[ErrorInfo]ADDCONSTRAINT [DF_ErrorInfo_ErrorInfo_GUID] DEFAULT(newid())FOR [ErrorInfo_ TABLE[srv]。[ErrorInfo]ADDCONSTRAINT [DF_ErrorInfo_InsertDate] DEFAULT(getdate())FOR [InsertDate] GOALTERTABLE[srv]。[ErrorInfo]ADDCONSTRAINT [DF_ErrorInfo_StartDate] DEFAULT(getdate())FOR [StartDate] GOALTER TABLE [ srv]。[ErrorInfo]ADDCONSTRAINT [DF_ErrorInfo_FinishDate] DEFAULT(getdate())FOR [FinishDate] GOALTERTABLE[srv]。[ErrorInfo]ADDCONSTRAINT [DF_ErrorInfo_Count] DEFAULT((1))FOR [Count] GOALTER TABLE [srv] 。[ErrorInfo]ADDCONSTRAINT [DF__ErrorInfo__Updat__5FFEE747] DEFAU LT(getdate())FOR [UpdateDate] GOALTERTABLE[srv]。[ErrorInfo]ADDCONSTRAINT [DF_ErrorInfo_IsRealTime] DEFAULT((0))FOR [IsRealTime] GOALTERTABLE[srv]。[ErrorInfo]ADDCONSTRAINT [DF_ErrorInfo_InsertUTCDate] DEFAULT( getutcdate())FOR [InsertUTCDate] GO[/ expand]
5。メッセージキューから送信されたメッセージのアーカイブテーブルを作成します:
[expand title =” Code”]
USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]。[ErrorInfoArchive]([ErrorInfo_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL、[ERROR_TITLE] [nvarchar](max)NULL、[ERROR_PRED_MESSAGE] [nvarchar] )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)WITH(PAD_INDEX =OFF、 STATISTICS_NORECOMPUTE =OFF、IGNORE_DUP_KEY =OFF、ALLOW_ROW_LOCKS =ON、ALLOW_PAGE_LOCKS =ON)ON [PRIMARY])ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GOALTE RTABLE[srv]。[ErrorInfoArchive]ADDCONSTRAINT [DF_ErrorInfoArchive_ErrorInfo_GUID] DEFAULT(newsequentialid())FOR [ErrorInfo_GUID] GOALTERTABLE[srv]。[ErrorInfoArchive]ADDCONSTRAINT [DF_ArchiveErrorInfo_InsertDate] DEFAULT(getdate()) [srv]。[ErrorInfoArchive]ADDCONSTRAINT [DF_ErrorInfoArchive_StartDate] DEFAULT(getdate())FOR [StartDate] GOALTERTABLE[srv]。[ErrorInfoArchive]ADDCONSTRAINT [DF_ErrorInfoArchive_FinishDate] DEFAULT(getdate())FOR [FinishDate] GOALTER TABLE [FinishDate] GOALTER TABLE [ ]。[ErrorInfoArchive]ADDCONSTRAINT [DF_ErrorInfoArchive_Count] DEFAULT((1))FOR [Count] GOALTERTABLE[srv]。[ErrorInfoArchive]ADDCONSTRAINT [DF_ErrorInfoArchive_UpdateDate] DEFAULT(getdate())FOR [UpdateDate] GOALTERTABLE[srv]。 [ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_IsRealTime] DEFAULT((0))FOR [IsRealTime] GOALTERTABLE[srv]。[ErrorInfoArchive]ADDCONSTRAINT [DF_ErrorInfoArchive_InsertUTCDate] DEFAULT(getutcdate())FOR [InsertUTCD再>[/ expand]
この情報は履歴に必要です。さらに、このテーブルは非常に古いデータ(たとえば、1か月以上前)からクリアする必要があります。 6。メッセージキューに新しいメッセージを登録するストアドプロシージャを作成します。
[expand title =” Code”]
USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATEPROCEDURE[srv]。[ErrorInfoIncUpd]@ERROR_TITLEnvarchar(max)、@ERROR_PRED_MESSAGE nvarchar(max)、@ERROR_NUMBER nvarchar(max)、@ERROR_MESSAGE nvar nvarchar(max)、@ ERROR_PROCEDURE nvarchar(max)、@ ERROR_POST_MESSAGE nvarchar(max)、@ RECIPIENTS nvarchar(max)、@ StartDate datetime =null、@ FinishDate datetime =null、@ IsRealTime bit =0ASBEGIN/*エラーへのログインエラーテーブルに同じタイトル、コンテンツ、送信者のエントリがすでにある場合に電子メールで送信されるテーブル、エラーの終了日、レコードの更新日、およびエラーの数が変更されます* / SET NOCOUNTオン; @ErrorInfo_GUIDuniqueidentifierを宣言します。 srv.ErrorInfoからトップ1の@ErrorInfo_GUID=ErrorInfo_GUIDを選択します。ここで([email protected]_TITLEまたは@ERROR_TITLEはnull)および[email protected]および([email protected]_MESSAGEまたは@ERROR_MESSAGEはnull)および([email protected]_PRED_MESSAGEまたは@ERROR_PRED_MESSAGEがnull)および([email protected]_POST_MESSAGEまたは@ERROR_POST_MESSAGEがnull)および([email protected]または@IsRealTimeがnull); if(@ErrorInfo_GUID is null)srv.ErrorInfoへの挿入を開始します(ERROR_TITLE、ERROR_PRED_MESSAGE、ERROR_NUMBER、ERROR_MESSAGE、ERROR_LINE、ERROR_PROCEDURE、ERROR_POST_MESSAGE、RECIPIENTS、RED 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()where [email protected]_GUID; endENDGO[/ expand]
7。コードまたは受信者のプライマリ電子メールアドレスによってアドレスから文字列を返すストアドプロシージャを作成します。
[expand title =” Code”]
USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATEPROCEDURE[srv]。[GetRecipients]@Recipient_Namenvarchar(255)=NULL、@ Recipient_Code nvarchar(10)=NULL、@ Receives nvarchar(max)out / *電子メール通知の作成*/ASBEGIN SET NOCOUNT ON; set @ Recipients =''; @ example @ sqldat.com+d。[Address]+';'を選択しますfrom srv.Recipient as r innerjoinsrv。[Address]asd on r.Recipient_GUID =d.Recipient_GUID where([email protected]_Name or @Recipient_Name IS NULL)and([email protected]_Code or @Recipient_Code IS NULL)and r.IsDeleted=0およびd.IsDeleted=0; --r.InsertUTCDate desc、d.InsertUTCDatedescで並べ替えます。 if(len(@Recipients)> 0)set @ Recipients =substring(@ Recipients、1、len(@Recipients)-1); ENDGO[/ expand]
8。日付と時刻を操作するために必要な関数を作成します:
[expand title =” Code”]
USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [rep]。[GetDateFormat](@dt datetime、//入力日付@format int =0 //プリセット形式)RETURNS nvarchar(255)AS/*日付を次のように返します指定された形式と入力日付に従った文字列必要に応じてゼロを挿入します:形式入力日付結果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 DECLARE @res nvarchar(255); DECLARE @day int =DAY(@dt); DECLARE @month int =MONTH(@dt); DECLARE @year int =YEAR(@dt); if(@ format =0)begin set @ res =IIF(@day <10、 '0' + cast(@day as nvarchar(1))、cast(@day as nvarchar(2)))+'。'; set @ example @ sqldat.com + IIF(@month <10、 '0' + cast(@month as nvarchar(1))、cast(@month as nvarchar(2)))+'。'; @ example @ sqldat.com + cast(@year as nvarchar(255));を設定します。 end else if(@ format =1)begin set @ res =IIF(@month <10、 '0' + cast(@month as nvarchar(1))、cast(@month as nvarchar(2)))+'。 '; @ example @ sqldat.com + cast(@year as 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 FUNCTION [rep]。[GetTimeFormat](@dt datetime、// input time @format int =0 //プリセット形式)RETURNS nvarchar(255)AS/*戻り値指定された形式と入力時間に応じた文字列としての時間必要に応じてゼロを挿入します。形式入力時間の結果017:04"17:04:00" 1 17:04 "17:04" 1 8:04 "08:04 "2 17:04" 17 "* / BEGIN DECLARE @res nvarchar(255); DECLARE @hour int =DATEPART(HOUR、@dt); DECLARE @min int =DATEPART(MINUTE、@dt); DECLARE @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 @ example @ sqldat.com + IIF(@min <10、 '0' + cast(@min as nvarchar(1))、cast(@min as nvarchar(2)))+':'; set @ example @ sqldat.com + IIF(@sec <10、 '0' + cast(@sec as nvarchar(1))、cast(@sec as 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 @ example @ sqldat.com + IIF(@min <10、 '0' + cast(@min as nvarchar(1))、cast(@min as nvarchar(2))); end else if(@ format =2)begin set @ res =IIF(@hour <10、 '0' + cast(@hour as nvarchar(1))、cast(@hour as nvarchar(2)));終了RETURN@res;ENDGO[/ expand]
9。テーブル形式のメッセージに関するHTMLレポートを作成するストアドプロシージャを作成します。
[expand title =” Code”]
USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATEPROCEDURE[srv]。[GetHTMLTable]@recipientsnvarchar(max)、@dtdatetime//読み取りの日付ASBEGIN/*テーブルのHTMLコードを生成*/SET NOCOUNT ON; @body nvarchar(max);を宣言します。 @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]nvarcharを宣言します(max)、[ERROR_PROCEDURE] nvarchar(max)、[ERROR_POST_MESSAGE] nvarchar(max)、[InsertDate] datetime、[StartDate] datetime、[FinishDate] datetime、[Count] int); @ID int、@ ERROR_TITLE nvarchar(max)、@ ERROR_PRED_MESSAGE nvarchar(max)、@ ERROR_NUMBER nvarchar(max)、@ ERROR_MESSAGE nvarchar(max)、@ ERROR_LINE nvarchar(max)、@ ERROR_PROCEDURE nvarchar(max)、@ERROR_POST_M (max)、@ InsertDate datetime、@ StartDate datetime、@ FinishDate datetime、@ Count int insert into @tbl([ERROR_TITLE]、[ERROR_PRED_MESSAGE]、[ERROR_NUMBER]、[ERROR_MESSAGE]、[ERROR_LINE]、[ERROR_PROCEDURE]、[ERROR_POST_ ]、[InsertDate]、[StartDate]、[FinishDate]、[Count])トップ100を選択[ERROR_TITLE]、[ERROR_PRED_MESSAGE]、[ERROR_NUMBER] 、[ERROR_MESSAGE]、[ERROR_LINE]、[ERROR_PROCEDURE]、[ERROR_POST_MESSAGE]、[InsertDate]、[StartDate]、[FinishDate]、[Count] from[srv]。[ErrorInfo]where([RECIPIENTS] [email protected] )または(@recipients IS NULL)およびInsertDateを選択します'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com+'№п/п'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com +'DATE'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com +'ERROR'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com +'DESCRIPTION'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com+'エラーコード'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com +'MESSAGE'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com +'START'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com +'FINISH'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com +'NUMBER'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com+'行番号'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com +'PROCEDURE'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com+'注'; set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; while((select top 1 1 from @tbl)> 0)begin set @ [email protected] +'';トップ1を選択@ID=[ID]、@ ERROR_TITLE =[ERROR_TITLE]、@ ERROR_PRED_MESSAGE =[ERROR_PRED_MESSAGE]、@ ERROR_NUMBER =[ERROR_NUMBER]、@ ERROR_MESSAGE =[ERROR_MESSAGE]、@ ERROR_LINE =[ERROR_LINE]、@ ERROR_PROCEDURE =[ERROR_PRO ]、@ ERROR_POST_MESSAGE =[ERROR_POST_MESSAGE]、@ InsertDate =[InsertDate]、@ StartDate =[StartDate]、@ FinishDate =[FinishDate]、@ Count =[Count] from @tbl order by InsertDate asc; set @ example @ sqldat.com +' ';エンドセット@example@ sqldat.com +''; @body; ENDGO'; @ example @ sqldat.com + cast(@ID as nvarchar(max));を設定します。 set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com + rep.GetDateFormat(@InsertDate、default)+'' + rep.GetTimeFormat(@InsertDate、default); // cast(@InsertDate as nvarchar(max)); set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com + isnull(@ERROR_TITLE、''); set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com + isnull(@ERROR_PRED_MESSAGE、''); set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com + isnull(@ERROR_NUMBER、''); set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com + isnull(@ERROR_MESSAGE、''); set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com + rep.GetDateFormat(@StartDate、default)+'' + rep.GetTimeFormat(@StartDate、default); // cast(@StartDate as nvarchar(max)); set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com + rep.GetDateFormat(@FinishDate、default)+'' + rep.GetTimeFormat(@FinishDate、default); // cast(@FinishDate as nvarchar(max)); set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; @ example @ sqldat.com + cast(@Count as nvarchar(max));を設定します。 set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com + isnull(@ERROR_LINE、''); set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com + isnull(@ERROR_PROCEDURE、''); set @ example @ sqldat.com +' '; set @ example @ sqldat.com +''; set @ example @ sqldat.com + isnull(@ERROR_POST_MESSAGE、''); set @ example @ sqldat.com +' '; @tblから削除します。[email protected]; set @ example @ sqldat.com +'[/ expand]
10。メッセージを送信するストアドプロシージャを作成します:
[expand title =” Code”]
USE [DATABAE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATEPROCEDURE[srv]。[RunErrorInfoProc]@IsRealTimebit =0 //送信モード(1-リアルタイム)ASBEGIN/*指定されたモードでエラー通知を送信*/SET NOCOUNT ON; @dt datetime =getdate();を宣言します。 @tbl table(Recipients nvarchar(max));を宣言します。 @recipients nvarchar(max);を宣言します。 @recipient nvarchar(255);を宣言します。 @resultを宣言するnvarchar(max)=''; @recp nvarchar(max);を宣言します。 @indintを宣言します。 @recipients_key nvarchar(max);を宣言します。 //必要なすべてのメッセージを受信します@tbl(Recipients)に挿入しますselect [RECIPIENTS] from srv.ErrorInfo where InsertDate0)begin //受信者を受信しますselecttop(1)@recipients =Recipients from @tbl; @[email protected]を設定します。 set @ result =''; //各受信者に対してwhile(len(@recipients)> 0)begin set @ ind =CHARINDEX(';'、@recipients); if(@ind> 0)begin set @ recipient =substring(@recipients、1、@ ind-1); @ recipients =substring(@ recipients、@ ind + 1、len(@recipients)[email protected]);を設定します。 end else begin set @ [email protected]; set @ recipients ='';終わり; //受信者の電子メールを受信しますexec[srv]。[GetRecipients]@example @ sqldat.com、@ example @ sqldat.com out; if(len(@recp)=0)beginexec[srv]。[GetRecipients]@example @ sqldat.com、@ example @ sqldat.com out; if(len(@recp)=0)set @ [email protected]; end//記号で区切る';' set @ example @ sqldat.comexample @ sqldat.com +';';エンドセット@result=substring(@ result、1、len(@result)-1); @[email protected]を設定します。 //指定された受信者と日付を含むHTMLレポートを@rec_body(Body)に挿入しますexec srv.GetHTMLTable @ example @ sqldat.com_key、@ example @ sqldat.com; //HTMLレポートを受信しますselecttop(1)@ body =Body from @rec_body; //実際の送信EXECmsdb.dbo.sp_send_dbmail//作成した管理者プロファイルの電子メール送信@profile_name='ALARM'、//受信者の電子メール@recipients =@recipients、//メッセージのテキスト@body =@body、//件名@subject =N'実行エラーに関する情報'、@ body_format ='HTML'-、//たとえば、ランダムSQLクエリの結果をメッセージ[email protected] =@query--'SELECTTOPに追加しましょう。 10名前FROMsys.objects'; @tblから削除します。[email protected]_key; @rec_bodyから削除; end//送信されたメッセージをアーカイブするINSERTINTO[srv]。[ErrorInfoArchive]([ErrorInfo_GUID]、[ERROR_TITLE]、[ERROR_PRED_MESSAGE]、[ERROR_NUMBER]、[ERROR_MESSAGE]、[ERROR_LINE]、[ERROR_PROCEDURE]、[ERROR_POST_MESSAGE]、[ RECIPIENTS]、[StartDate]、[FinishDate]、[Count]、IsRealTime)SELECT [ErrorInfo_GUID]、[ERROR_TITLE]、[ERROR_PRED_MESSAGE]、[ERROR_NUMBER]、[ERROR_MESSAGE]、[ERROR_LINE]、[ERROR_PROCEDURE]、[ERROR_POS [RECIPIENTS]、[StartDate]、[FinishDate]、[Count]、IsRealTimeFROM[srv]。[ErrorInfo][email protected]およびInsertDate [/ expand]
このストアドプロシージャは、メッセージキューから各メッセージを取得し、テーブル形式のHTMLレポートにラップします。受信者の場合、コードまたはプライマリ電子メールアドレスに基づいて、メッセージの送信先となる電子メールアドレスで構成される文字列が作成されます。このようにして、選択されたすべてのメッセージが処理されます。ここでは、msdb.dbo.sp_send_dbmailストアドプロシージャが使用されます。
11。エージェントで2つのタスクを作成します(最初のタスクはリアルタイム通知用(1分あたり1回のスケジュール)、2番目のタスクは単純な通知用(1時間あたり1回のスケジュール))。タスクのコードに以下を追加します:
EXECUTE[DATABASE_NAME]。[srv]。[RunErrorInfoProc]@IsRealTime =0; // 0-単純なメッセージの場合、1-リアルタイムメッセージの場合エラー報告の例を次に示します。
[expandtitle =”コード”]
begin tryexec[DATABASE_NAME]。[srv]。[KillFullOldConnect];endtrybegin catchdeclare @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)='サーバー上の応答しないプロセスの削除'の例@ sqldat.com @ servername、@str_pred_mess nvarchar(max)='example @ sqldat.com @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_LINE =@str_line、@ ERROR_PROCEDURE =@str_proc、@ ERROR_ RECIPIENTS ='RECIPIENT1; RECIPIENT2'; @ err example @ sqldat.com@errorを宣言します。 raiserror(@ str_mess、16,1); end catch[/ expand]
ここでは、svr.KillFullOldConnectストアドプロシージャが使用されます。
結果 この記事には、通常のデータベースメールの機能を拡張する例と、HTMLテーブルで通知を生成して管理者に電子メールで送信する方法の例が含まれています。このアプローチにより、さまざまな問題についてリアルタイムまたは特定の時間後に管理者に通知できるため、重大な問題の発生とDBMSおよびサーバーの障害を最小限に抑え、ワークフローの遅延から本番環境を保護できます。
参照:
- Sp_send_dbmail
- データベースメール
- Srv.KillFullOldConnect