Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cấu hình thông báo thư cơ sở dữ liệu trong MS SQL Server

Giới thiệu

Thông thường, cần phải thông báo bằng cách nào đó cho quản trị viên về các sự cố xảy ra với máy chủ. Thông báo thường được chia thành 2 loại:

1) thông báo thời gian thực, tức là những thông báo phải đến ngay lập tức khi có sự cố xảy ra

2) thông báo bị trễ, tức là những thông báo đến sau một thời gian khá dài (hơn 1 giờ) sau khi sự cố xảy ra.

Trong công việc của tôi, cần phải mở rộng chức năng của Thư cơ sở dữ liệu SQL Server thông thường.

Trong bài viết này, chúng tôi sẽ xem xét một ví dụ về cách tạo thông báo trong bảng HTML và sau đó gửi chúng cho quản trị viên.

Giải pháp

1. Định cấu hình Thư cơ sở dữ liệu

2. Tạo bảng cho người nhận:

[expand title =”Mã”]

 USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER BẢNG ONGOCREATE [srv]. [Người nhận] ([Recipient_GUID] [uniqueidentifier] ROWGUIDCOL KHÔNG NULL, [Tên người nhận] [nvarchar] (255) KHÔNG NULL email chính Recipient_Code] [nvarchar] (10) NOT NULL, // mã của người nhận [IsDeleted] [bit] NOT NULL, // chỉ báo xóa (cho dù người nhận có được sử dụng hay không) [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_Recipient ] KHÓA CHÍNH ĐÃ ĐƯỢC ĐÓNG CỬA ([Recipient_GUID] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY], CONSTRAINTIEDCode [AK_Recipient] UNCLipient (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 NONCLUSTERICS ([Recipient_Name] F, IGNORE_DUP_KEY =TẮT, ALLOW_ROW_LOCKS =BẬT, ALLOW_PAGE_LOCKS =BẬT) BẬT [CHÍNH]) BẬT [CHÍNH] BẢNG MỤC TIÊU [srv]. [Người nhận] THÊM CONSTRAINT [DF_Recipient_Recipient_GUIDTER] BẢNG MỤC TIÊU [CHÍNH] srv. 

[/ expand]

3. Tạo một bảng cho địa chỉ của những người nhận:

[expand title =”Mã”]

 USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv]. [Address] ([Address_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Recipient_GUID] [uniqueidentifier] NOT NULL, // người nhận [Address] 255) NOT NULL, // email [IsDeleted] [bit] NOT NULL, // chỉ báo xóa (email có được sử dụng hay không) [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED ([Address_GUID] ASC ) VỚI (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] , STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] GOALTER TABLE [srv]. [Address] ADD CONSTRAINT [DF_Address_Address_Address_GUID] DEFsequential_Address_GUID] BẢNG MỤC TIÊU [ srv]. [Address] ADD CONSTRAINT [DF_Address_IsDeleted] DEFAULT ((0)) FOR [IsDeleted] GOALTER TABLE [srv]. [Address] ADD CONSTRAINT [DF_Address_InsertUTCDate] DEFAULT (getutcdate ()) CHO [GOUTCpre> 

[/ expand]

4. Tạo bảng cho hàng đợi tin nhắn:

[expand title =”Mã”]

 USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER BẢNG ONGOCREATE [srv]. [ErrorInfo] ([ErrorInfo_GUID] [uniqueidentifier] NOT NULL, [ERROR_TITLE] [nvarchar] (max) NULL, // nvar_MESS] (tối đa) NULL, // thông tin sơ bộ [ERROR_NUMBER] [nvarchar] (tối đa) NULL, // mã thông báo (lỗi) [ERROR_MESSAGE] [nvarchar] (tối đa) NULL, // thông báo [ERROR_LINE] [nvarchar] (tối đa) NULL, // số dòng [ERROR_PROCEDURE] [nvarchar] (max) NULL, // thủ tục được lưu trữ [ERROR_POST_MESSAGE] [nvarchar] (max) NULL, // thông tin giải thích [RECIPIENTS] [nvarchar] (max) NULL, // người nhận phân tách bằng ';' [InsertDate] [datetime] NOT NULL, [StartDate] [datetime] NOT NULL, // dữ liệu và thời gian bắt đầu [FinishDate] [datetime] NOT NULL, // kết thúc ngày và giờ [Count] [int] NOT NULL, // số lần [UpdateDate] [dat etime] NOT NULL, [IsRealTime] [bit] NOT NULL, // chỉ báo thời gian thực [InsertUTCDate] [datetime] NULL, CONSTRAINT [PK_ErrorInfo] PRIMARY KEY CLUSTERED ([ErrorInfo_GUID] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GOALTER TABLE [srv]. [ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_Error] ErrorInfo_ATERAL FOR TABLE [srv]. [ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_InsertDate] DEFAULT (getdate ()) FOR [InsertDate] GOALTER TABLE [srv]. [ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_StartDate] DEFAULT (getdate) srv]. [ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_FinishDate] DEFAULT (getdate ()) FOR [FinishDate] GOALTER TABLE [srv]. [ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_Count] DEFAULT ((1)) CHO [Đếm] MỤC TIÊU . [ErrorInfo] THÊM DANH MỤC [DF__ErrorInfo__Updat__5FFEE747] DEFAU LT (getdate ()) FOR [UpdateDate] GOALTER TABLE [srv]. [ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_IsRealTime] DEFAULT ((0)) CHO [IsRealTime] BẢNG MỤC TIÊU [srv]. [ErrorInfo] ADD CONSTRAINT [DF_Erertfo] ADD CONSTRAINT [DF_Erertfo] getutcdate ()) CHO [InsertUTCDate] GO 

[/ expand]

5. Tạo bảng lưu trữ cho các thư được gửi từ hàng đợi thư:

[expand title =”Mã”]

 USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER BẢNG ONGOCREATE [srv]. [ErrorInfoArchive] ([ErrorInfo_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [ERAGE_TITLE] [nvarcharED_Mvar] (max) ) NULL, [ERROR_NUMBER] [nvarchar] (tối đa) NULL, [ERROR_MESSAGE] [nvarchar] (tối đa) NULL, [ERROR_LINE] [nvarchar] (tối đa) NULL, [ERROR_PROCEDURE] [nvarchar] (tối đa) NULL, [ERROR_POST_MESSAGE] [nvarchar] (tối đa) 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) VỚI (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 R BẢNG [srv]. [ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_ErrorInfo_GUID] DEFAULT (newsequentialid ()) CHO [ErrorInfo_GUID] GOALTER TABLE [srv]. [ErrorInfoArchive] [srv]. [ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_StartDate] DEFAULT (getdate ()) FOR [StartDate] GOALTER BẢNG [srv]. [ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArate] getTERdateFinish [DF_ErrorInfoArate] ]. [ErrorInfoArchive] THÊM CONSTRAINT [DF_ErrorInfoArchive_Count] DEFAULT ((1)) CHO [Đếm] BẢNG MỤC TIÊU [srv]. [ErrorInfoArchive] THÊM CONSTRAINT [DF_ErrorInfoArchive_UpABLEdate [Đếm] MỤC TIÊU [srv]. [ErrorInfoArchive] THÊM CONSTRAINT [DF_ErrorInfoArchive_IsRealTime] DEFAULT ((0)) CHO [IsRealTime] BẢNG MỤC TIÊU [srv]. [ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchiven lại> 

[/ expand]

Thông tin này cần thiết cho lịch sử. Ngoài ra, bảng này cần được xóa khỏi dữ liệu rất cũ (ví dụ:cũ hơn một tháng).

6. Tạo một thủ tục được lưu trữ để đăng ký một tin nhắn mới trong hàng đợi tin nhắn:

[expand title =”Mã”]

 USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]. [ErrorInfoIncUpd] @ERROR_TITLE nvarchar (max), @ERROR_PRED_MESSAGE nvarchar (max), @ERROR_MESSAGE @ nvarchar (maxLINE) nvarchar (maxLINE @LINE nvarchar (maxLINE) nvarchar (max), @ERROR_PROCEDURE nvarchar (max), @ERROR_POST_MESSAGE nvarchar (max), @RECIPIENTS nvarchar (max), @StartDate datetime =null, @FinishDate datetime =null, @IsRealTime bit =0ASBEGIN lỗi / * Lỗi ghi lỗi bảng sẽ được gửi qua email nếu bảng đã có mục nhập có cùng tiêu đề, nội dung và người gửi, ngày kết thúc của lỗi, ngày cập nhật bản ghi, cũng như số lỗi sẽ thay đổi * / SET NOCOUNT TRÊN; khai báo @ErrorInfo_GUID uniqueidentifier; chọn top 1 @ ErrorInfo_GUID =ErrorInfo_GUID từ srv.ErrorInfo trong đó ([email protected]_TITLE hoặc @ERROR_TITLE là null) và [email protected] và ([email protected]_MESSAGE hoặc @ERROR_MESSAGE là null) và ([email protected] hoặc @ERROR_PRED_MESSAGE là rỗng) và ([email protected]_POST_MESSAGE hoặc @ERROR_POST_MESSAGE là rỗng) và ([email protected] hoặc @IsRealTime là rỗng); if (@ErrorInfo_GUID is null) bắt đầu chèn vào srv.ErrorInfo (ERROR_TITLE, ERROR_PRED_MESSAGE, ERROR_NUMBER, ERROR_MESSAGE, ERROR_LINE, ERROR_PROCEDURE, ERROR_POST_MESSAGE, RECIPIENTS, RECIPIENTS, ERBER_NUMBER, ERORRESS @ chọn, IsReal_MORRESS @ ERAGE, @PRAGE, ERAGE, @PRAGE, ERAGE @ 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. Tạo một thủ tục được lưu trữ trả về một chuỗi từ các địa chỉ bằng mã hoặc địa chỉ email chính của người nhận:

[expand title =”Mã”]

 USE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]. [GetRecipient] @Recipient_Name nvarchar (255) =NULL, @ Recipient_Code nvarchar (10) =NULL, @ Người nhận out nvar *char (thủ tục tối đa) tạo thông báo qua email * / ASBEGIN ĐẶT SỐ TÀI KHOẢN BẬT; đặt @ Người nhận =''; chọn @ example @ sqldat.com + d. [Địa chỉ] + ';' từ srv. r.IsDeleted =0 và d.IsDeleted =0; - đặt hàng theo r.InsertUTCDate desc, d.InsertUTCDate desc; if (len (@Recipient)> 0) set @ Recipthers =substring (@ Recipthers, 1, len (@Recipient) -1); ENDGO 

[/ expand]

8. Tạo các chức năng cần thiết để làm việc với ngày và giờ:

[expand title =”Mã”]

 SỬ DỤNG [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER CHỨC NĂNG ONGOCREATE [đại diện]. [GetDateFormat] (@dt datetime, // ngày nhập vào @format int =0 // định dạng đặt trước) RETURNS nvarchar (255) AS / * Trả về ngày là một chuỗi theo định dạng được chỉ định và ngày nhập Chèn các số không khi cần thiết:định dạng ngày nhập kết quả 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); KHAI BÁO @day int =DAY (@dt); KHAI BÁO @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))) + '.'; set @ 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))) + '. '; set @ 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 // định dạng đặt trước) RETURNS nvarchar (255) AS / * Trả về thời gian dưới dạng chuỗi theo định dạng được chỉ định và thời gian nhập Chèn các số không khi cần thiết:kết quả thời gian nhập định dạng 0 17:04 "17:04:00" 1 17:04 "17:04" 1 8:04 "08:04 "2 17:04" 17 "* / BẮT ĐẦU KHAI BÁO @res nvarchar (255); DECLARE @hour int =DATEPART (HOUR, @dt); DECLARE @min int =DATEPART (PHÚT, @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))); end RETURN @res; ENDGO 

[/ expand]

9. Tạo một thủ tục được lưu trữ để tạo một báo cáo HTML về các thư ở dạng bảng:

[expand title =”Mã”]

 SỬ DỤNG [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER QUY TRÌNH ONGOCREATE [srv]. [GetHTMLTable] @recipient nvarchar (max), @ dt datetime // theo ngày đọcASBEGIN / * tạo mã HTML cho bảng * / BẬT SỐ KHOẢN; khai báo @body nvarchar (max); khai báo bảng @tbl (ID int ID (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); khai báo @ID int, @ ERROR_TITLE nvarchar (tối đa), @ ERROR_PRED_MESSAGE nvarchar (tối đa), @ ERROR_NUMBER nvarchar (tối đa), @ ERROR_MESSAGE nvarchar (tối đa), @ ERROR_LINE nvarchar (tối đa), @ ERROR_PROCEDURE nvarcharOR (tối đa), @ ERRESS_MESSION nvarcharOR (tối đa) (max), @ InsertDate datetime, @ StartDate datetime, @ FinishDate datetime, @ Count int insert into @tbl ([ERROR_TITLE], [ERROR_PRED_MESSAGE], [ERROR_NUMBER], [ERROR_MESSAGE], [ERROR_LINE], [ERROR_PROCEDAGE_POST_MESSOR ], [InsertDate], [StartDate], [FinishDate], [Count]) chọn 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] ) hoặc (@ tá dược LÀ NULL) và 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 + 'LỖI'; 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 + 'MÃ LỖI'; 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 + 'SỐ DÒNG'; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'THỦ TỤC'; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + 'LƯU Ý'; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + ''; while ((chọn top 1 1 từ @tbl)> 0) begin set @ example @ sqldat.com + ''; chọn top 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], @ ERRORURE_LINE_ROPED @ ERRORROR =[ERROR_LINE] ], @ ERROR_POST_MESSAGE =[ERROR_POST_MESSAGE], @ InsertDate =[InsertDate], @ StartDate =[StartDate], @ FinishDate =[FinishDate], @ Count =[Count] từ đơn hàng @tbl của InsertDate asc; set @ example @ sqldat.com + ''; set @ 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); // ép kiểu (@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); // ép kiểu (@StartDate as nvarchar (max)); set @ example @ sqldat.com + ''; set @ example @ sqldat.com + ''; set @ example @ sqldat.com + rep.GetDateFormat (@FinishDate, default) + '' + rep.GetTimeFormat (@FinishDate, default); // ép kiểu (@FinishDate as nvarchar (max)); set @ example @ sqldat.com + ''; set @ example @ sqldat.com + ''; set @ 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 + ''; xóa khỏi @tbl nơi [email protected]; set @ example @ sqldat.com + ''; end set @ example @ sqldat.com + ''; chọn @body; ENDGO 

[/ expand]

10. Tạo một thủ tục được lưu trữ để gửi tin nhắn:

[expand title =”Mã”]

 USE [DATABAE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]. [RunErrorInfoProc] @IsRealTime bit =0 // chế độ gửi (1-thời gian thực) ASBEGIN / * gửi thông báo lỗi với chế độ đã chỉ định * / BẬT NOCOUNT; khai báo @dt datetime =getdate (); khai báo bảng @tbl (Người nhận nvarchar (max)); khai báo @re tá dược nvarchar (max); khai báo @recipient nvarchar (255); khai báo @result nvarchar (max) =''; khai báo @recp nvarchar (max); khai báo @ind int; khai báo @recipient_key nvarchar (max); // nhận tất cả các tin nhắn cần thiết chèn vào @tbl (Người nhận) chọn [RECIPIENTS] từ srv.ErrorInfo nơi InsertDate  0) begin // nhận người nhận chọn top (1) @ người nhận =Người nhận từ @tbl; set @ example @ sqldat.com; set @ result =''; // cho mỗi người nhận while (len (@recipient)> 0) begin set @ ind =CHARINDEX (';', @recipient); if (@ind> 0) begin set @ receiver =substring (@ người nhận, 1, @ ind-1); đặt @ người nhận =chuỗi con (@ người nhận, @ ind + 1, len (@ người nhận) [email protected]); end else begin set @ example @ sqldat.com; đặt @ người nhận =''; chấm dứt; // nhận email của người nhận execute [srv]. [GetRecipient] @ example @ sqldat.com, @ example @ sqldat.com out; if (len (@recp) =0) begin exec [srv]. [GetRecipient] @ example @ sqldat.com, @ example @ sqldat.com out; if (len (@recp) =0) set @ example @ sqldat.com; end // phân cách bằng ký hiệu ';' set @ example @ sqldat.comexample @ sqldat.com + ';'; end set @ result =substring (@ result, 1, len (@result) -1); set @ example @ sqldat.com; // nhận báo cáo HTML với người nhận được chỉ định và chèn ngày tháng vào @rec_body (Body) execute srv.GetHTMLTable @ example @ sqldat.com_key, @ example @ sqldat.com; // nhận báo cáo HTML select top (1) @ body =Body từ @rec_body; // gửi thực tế EXEC msdb.dbo.sp_send_dbmail // gửi email hồ sơ quản trị viên mà chúng tôi đã tạo @profile_name ='ALARM', // email người nhận @recipient =@recipient, // nội dung thư @body =@body, // Chủ đề @subject =KHÔNG THÔNG TIN VỀ LỖI THI CÔNG ', @ body_format =' HTML '-, // Ví dụ:hãy thêm kết quả của một truy vấn SQL ngẫu nhiên vào thông báo [email protected] =@query -' CHỌN ĐẦU 10 tên TỪ sys.objects '; xóa khỏi @tbl nơi [email protected]_key; xóa khỏi @rec_body; end // lưu trữ các thư đã gửi CHÈN VÀO [srv]. [ErrorInfoArchive] ([ErrorInfo_GUID], [ERROR_TITLE], [ERROR_PRED_MESSAGE], [ERROR_NUMBER], [ERROR_MESSAGE], [ERROR_LINE], [ERROR_PROCEDURE], [ERROR_PROCEDURE], [ERROR_PROCEDURE] RECIPIENTS], [StartDate], [FinishDate], [Count], IsRealTime) CHỌN [ErrorInfo_GUID], [ERROR_TITLE], [ERROR_PRED_MESSAGE], [ERROR_NUMBER], [ERROR_MESSAGE], [ERROR_LINE], [ERROR_PROST_MRORAGE], [ERROR_PROST_MRORAGE] [RECIPIENTS], [StartDate], [FinishDate], [Count], IsRealTime FROM [srv]. [ErrorInfo] where [email protected] và InsertDate  

[/ expand]

Thủ tục được lưu trữ này lấy từng thư từ hàng đợi thư và gói nó trong một báo cáo HTML ở dạng bảng. Đối với người nhận, dựa trên mã hoặc địa chỉ email chính của họ, nó tạo ra một chuỗi bao gồm các địa chỉ email để gửi thư tới đó. Bằng cách này, tất cả các thư đã chọn sẽ được xử lý. Ở đây, thủ tục lưu trữ msdb.dbo.sp_send_dbmail được sử dụng.

11. Tạo hai tác vụ trong Agent (nhiệm vụ đầu tiên dành cho thông báo thời gian thực (lên lịch 1 lần mỗi phút), tác vụ thứ hai dành cho thông báo đơn giản (lập lịch 1 lần mỗi giờ)). Thêm phần sau vào mã của nhiệm vụ:

 THỰC HIỆN [DATABASE_NAME]. [srv]. [RunErrorInfoProc] @ IsRealTime =0; // 0 - cho các tin nhắn đơn giản và 1 - cho các tin nhắn thời gian thực 

Đây là một ví dụ về báo cáo lỗi:

[expand title =”Mã”]

 bắt đầu thử thực hiện [DATABASE_NAME]. [srv]. [KillFullOldConnect]; end trybegin catch khai báo @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) ='XÓA CÁC QUY TRÌNH KHÔNG PHẢN HỒI TRÊN MÁY CHỦ' ví dụ @ sqldat.com @ servername, @str_pred_mess nvarchar (max) ='LỖI XÓA CÁC QUÁ TRÌNH KHÔNG PHẢI ỨNG PHÓ ĐÃ THÀNH CÔNG TRÊN' example @ sqldat.com @ servername + 'SERVER'; thi hành [DATABASE_NAME] .srv.ErrorInfoIncUpd @ERROR_TITLE =@str_title, @ERROR_PRED_MESSAGE =@str_pred_mess, @ERROR_NUMBER =@str_num, @ERROR_MESSAGE =@str_mess, @ERROR_ULL_LINE, @ESS_OSTPAGE, @ NERRUREPAGE =@ NERROR_LINE RECIPIENTS ='RECIPIENT1; RECIPIENT2'; khai báo lỗi @err example @ sqldat.com @; raiserror (@ str_mess, 16,1); bắt cuối 

[/ expand]

Tại đây, quy trình được lưu trữ svr.KillFullOldConnect được sử dụng.

Kết quả

Bài viết này bao gồm một ví dụ về mở rộng chức năng của Thư cơ sở dữ liệu thông thường và ví dụ về cách tạo thông báo trong bảng HTML và sau đó gửi chúng qua email cho quản trị viên. Cách tiếp cận này cho phép thông báo cho quản trị viên về các vấn đề khác nhau trong thời gian thực hoặc sau một thời gian nhất định, do đó giảm thiểu việc xảy ra sự cố nghiêm trọng và lỗi của DBMS và máy chủ, do đó bảo vệ quá trình sản xuất khỏi sự chậm trễ của quy trình làm việc.

Tài liệu tham khảo:

  1. Sp_send_dbmail
  2. Thư Cơ sở dữ liệu
  3. Srv.KillFullOldConnect

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lựa chọn bộ xử lý thực tế cho khối lượng công việc OLTP SQL Server 2014/2016

  2. Hàm COALESCE trong TSQL

  3. Máy chủ SQL trên Linux

  4. Danh sách các hàm ngày và giờ trong SQL Server (T-SQL)

  5. 11 cách trả về khóa ngoại trong cơ sở dữ liệu máy chủ SQL bằng T-SQL