Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengonfigurasi Notifikasi Email Database di MS SQL Server

Pengantar

Seringkali, ada kebutuhan untuk memberi tahu administrator tentang masalah dengan server. Notifikasi secara umum dibagi menjadi 2 jenis:

1) notifikasi real-time, yaitu notifikasi yang harus segera datang saat terjadi masalah

2) notifikasi tertunda, yaitu notifikasi yang datang setelah waktu yang cukup lama (lebih dari 1 jam) setelah terjadi masalah.

Dalam pekerjaan saya, perlu untuk memperluas fungsionalitas SQL Server Database Mail biasa.

Dalam artikel ini, kami akan mempertimbangkan contoh cara membuat notifikasi di tabel HTML dan mengirimkannya ke administrator.

Solusi

1. Konfigurasikan Database Mail

2. Buat tabel untuk penerima:

[perluas judul ="Kode"]

GUNAKAN [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, // kode penerima [IsDeleted] [bit] NOT NULL, // indikator penghapusan (apakah penerima digunakan atau tidak) [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_Recipient ( ] PRIMARY KEY CLUSTERED ( [Recipient_GUID] ASC)DENGAN (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKSRecipient) [Kode_AKTIF] UNIQUEINT_NCON [PRIMER] (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =AKTIF, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY], CONSTRAINT [AK_Recipient_Name] UNIQUE NONCLUSTERED ( ASRE_TOP_NOCLUSTERED) STATISTRICIP (Penerima) F, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]GOALTER TABLE [srv].[Penerima] ADD CONSTRAINT [DF_Recipient_Recipient_Recipient_GUID] DEFAULT [GOFAULT_GUID] DEFAULT] DEFAULT [GOFAULT_Recipient_GUID] srv].[Penerima] ADD CONSTRAINT [DF_Recipient_IsDeleted] DEFAULT ((0)) UNTUK [IsDeleted]GOALTER TABLE [srv].[Recipient] ADD CONSTRAINT [DF_Recipient_InsertUTCDate] DEFAULT (getutcdate()) FOR [Insert>GO[/expand]

3. Buat tabel untuk alamat penerima:

[perluas judul ="Kode"]

GUNAKAN [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[Address]( [Address_GUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Recipient_GUID] [uniqueidentifier] NOT NULL, //nvarchar](penerima) 255) NOT NULL, // email [IsDeleted] [bit] NOT NULL, // indikator penghapusan (apakah email digunakan atau tidak) [InsertUTCDate] [datetime] NOT NULL, CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED ( [Address_GUID] ASC )DENGAN (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 (Alamat OFF) ASCLUSTERED ( =OFFCLUSTER_GUID) , STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]GOALTER TABLE [srv].[Alamat] ADD CONSTRAINT]Alamat_GUID]Alamat_GUID][DF_Alamat DF] TABEL GOL [ srv].[Address] ADD CONSTRAINT [DF_Address_IsDeleted] DEFAULT ((0)) FOR [IsDeleted]GOALTER TABLE [srv].[Address] ADD CONSTRAINT [DF_Address_InsertUTCDate] DEFAULT (getutcdate()) FOR [InsertUTCDate]GO

[/expand]

4. Buat tabel untuk antrian pesan:

[perluas judul ="Kode"]

GUNAKAN [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[ErrorInfo]( [ErrorInfo_GUID] [uniqueidentifier] NOT NULL, [ERROR_TITLE] [nvarchar](maks) [ERNULLOR] (maks) NULL, // informasi awal [ERROR_NUMBER] [nvarchar](maks) NULL, // kode pesan (kesalahan) [ERROR_MESSAGE] [nvarchar](maks) NULL, // pesan [ERROR_LINE] [nvarchar](maks) NULL, // nomor baris [ERROR_PROCEDURE] [nvarchar](max) NULL, // prosedur tersimpan [ERROR_POST_MESSAGE] [nvarchar](max) NULL, // informasi penjelasan [RECIPIENTS] [nvarchar](max) NULL, // penerima dipisahkan dengan ';' [InsertDate] [datetime] NOT NULL, [StartDate] [datetime] NOT NULL, // mulai data dan waktu [FinishDate] [datetime] NOT NULL, // finish date and time [Count] [int] NOT NULL, // berapa kali [Tanggal Pembaruan] [tanggal etime] NOT NULL, [IsRealTime] [bit] NOT NULL, // indikator waktu nyata [InsertUTCDate] [datetime] NULL, CONSTRAINT [PK_ErrorInfo] PRIMARY KEY CLUSTERED ( [ErrorInfo_GUID] ASC)DENGAN (PAD_INDEX =OFF, STATISTICS_NORE IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOALTER TABLE [srv].[ErrorInfo] TAMBAHKAN CONSTRAINT [DF_ERror]UNFOTERGUIDror) FOR [DF_ERror] TABEL [srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_InsertDate] DEFAULT (getdate()) UNTUK [InsertDate]GOALTER TABLE [srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_StartDate] DEFAULT [GOALTERtDate()] UNTUK [GOALTERtDate()] srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_FinishDate] DEFAULT (getdate()) UNTUK [FinishDate]GOALTER TABLE [srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_Count] DEFAULT ((1)) UNTUK [Count]GOALTER TABLE .[ErrorInfo] TAMBAHKAN KENDALA [DF__ErrorInfo__Updat__5FFEE747] DEFAU LT (getdate()) UNTUK [UpdateDate]GOALTER TABLE [srv].[ErrorInfo] ADD CONSTRAINT [DF_ErrorInfo_IsRealTime] DEFAULT ((0)) FOR [IsRealTime]GOALTER TABLE [srv].[ErrorInfo] TAMBAHKAN CONSTRAINT [DF_ErrorInfo_Info_InsertUT] getutcdate()) UNTUK [InsertUTCDate]GO

[/expand]

5. Buat tabel arsip untuk pesan yang dikirim dari antrian pesan:

[perluas judul ="Kode"]

GUNAKAN [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [srv].[ErrorInfoArchive]( [ErrorInfo_GUID] [pengidentifikasi unik] ROWGUIDCOL NOT NULL, [ERROR_TITRED](maxER_TITLE](maxER_TITLE] ) NULL, [ERROR_NUMBER] [nvarchar](maks) NULL, [ERROR_MESSAGE] [nvarchar](maks) NULL, [ERROR_LINE] [nvarchar](maks) NULL, [ERROR_PROCEDURE] [nvarchar](maks) NULL, [ERROR_POST_MESSAGE] [nvarchar](max) NULL, [PENERIMA] [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, STATISTICS_NORECOMPUTE =MATI, IGNORE_DUP_KEY =MATI, ALLOW_ROW_LOCKS =AKTIF, ALLOW_PAGE_LOCKS =AKTIF) HIDUP [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOALTE R TABEL [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_ErrorInfo_GUID] DEFAULT (newsequentialid()) UNTUK [ErrorInfo_GUID]GOALTER TABLE [srv].[ErrorInfoArchive] [GOArchiveInfoArchive] TAMBAHKAN CONSTRAINT [DF_Archive] [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_StartDate] DEFAULT (getdate()) UNTUK [StartDate]GOALTER TABLE [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive()s GOALFinishDate] FORULT (FinishDate) ].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_Count] DEFAULT ((1)) UNTUK [Count]GOALTER TABLE [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_UpdateDate] DEFAULT (getdateDate()) FOR [UpdateDate. [ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_IsRealTime] DEFAULT ((0)) UNTUK [IsRealTime]GOALTER TABLE [srv].[ErrorInfoArchive] ADD CONSTRAINT [DF_ErrorInfoArchive_InsertUTCDate]DEFAULT (dapatkan tanggal DEFAULT) kembali> 

[/expand]

Informasi ini diperlukan untuk riwayat. Selain itu, tabel ini perlu dibersihkan dari data yang sangat lama (misalnya, lebih dari satu bulan).

6. Buat prosedur tersimpan yang mendaftarkan pesan baru dalam antrian pesan:

[perluas judul ="Kode"]

GUNAKAN [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[ErrorInfoIncUpd] @ERROR_TITLE nvarchar(maks), @ERROR_PRED_MESSAGE nvarchar(Nvarchar(max), @ERROR_ nvarchar(max), @ERROR_PROCEDURE nvarchar(max), @ERROR_POST_MESSAGE nvarchar(max), @RECIPIENTS nvarchar(max), @StartDate datetime=null, @FinishDate datetime=null, @IsRealTime bit =0ASBEGIN /* Error logging in the error tabel akan dikirim melalui email jika tabel sudah memiliki entri dengan judul, konten, dan pengirim yang sama, tanggal akhir kesalahan, tanggal pembaruan catatan, serta jumlah kesalahan akan berubah */ SET NOCOUNT PADA; mendeklarasikan pengenal unik @ErrorInfo_GUID; pilih top 1 @ErrorInfo_GUID=ErrorInfo_GUID dari srv.ErrorInfo di mana ([email protected]_TITLE atau @ERROR_TITLE adalah null) dan [email protected] dan ([email protected]_MESSAGE atau @ERROR_MESSAGE adalah null) dan (example_PRED_MESSAGE.com_PRED_MESSAGE. atau @ERROR_PRED_MESSAGE adalah null) dan ([email protected]_POST_MESSAGE atau @ERROR_POST_MESSAGE adalah null) dan ([email protected] atau @IsRealTime adalah null); if (@errorinfo_guid null) Mulai masukkan ke srv.errorinfo (error_title, error_pred_message, error_number, error_message, error_line, error_procedure, error_post_message, penerima, isRealtime, startDate, fleasdate) pilih @ror_message, penerima, isRealtime, startDate, finishDate) Pilih @RorEre, @RorEre, @RorEM, ISREALtime, startDate, fleasdate) 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() di mana [email protected]_GUID; akhirENDGO

[/expand]

7. Buat prosedur tersimpan yang mengembalikan string dari alamat dengan kode atau alamat email utama penerima:

[perluas judul ="Kode"]

GUNAKAN [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[GetRecipients]@Recipient_Name nvarchar(255)=NULL,@Recipient_Code nvarchar(10)=NULL,@Recipients(maks) membuat notifikasi email*/ASBEGIN SET NOCOUNT ON; setel @Penerima=''; pilih @[email protected]+d.[Alamat]+';' dari srv.Recipient sebagai r batin bergabung dengan srv.[Alamat] sebagai d pada r.Recipient_GUID=d.Recipient_GUID di mana ([email protected]_Name atau @Recipient_Name IS NULL) dan ([email protected]_Code atau @Recipient_Code IS NULL) dan r.IsDeleted=0 dan d.IsDeleted=0; --pesan berdasarkan r.InsertUTCDate desc, d.InsertUTCDate desc; if(len(@Recipients)>0) setel @Recipients=substring(@Recipients,1,len(@Recipients)-1);ENDGO

[/expand]

8. Buat fungsi yang diperlukan untuk bekerja dengan tanggal dan waktu:

[perluas judul ="Kode"]

GUNAKAN [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [rep].[GetDateFormat] ( @dt datetime, // input tanggal @format int=0 // format preset)RETURNS nvarchar(255)AS/* Mengembalikan tanggal sebagai string sesuai dengan format yang ditentukan dan tanggal input Menyisipkan angka nol jika diperlukan:format tanggal input hasil 0 17.4.2014 "17.04.2014" 1 17.4.2014 "04.2014" 1 8.11.2014 "11.2014" 2 17.04.2014 "2014" */MULAI MENYATAKAN @res nvarchar(255); MENYATAKAN @hari int=DAY(@dt); MENYATAKAN @bulan int=BULAN(@dt); MENYATAKAN @tahun int=TAHUN(@dt); if(@format=0) start set @res=IIF(@day<10,'0'+cast(@day as nvarchar(1)), cast(@day as nvarchar(2)))+'.'; setel @[email protected]+IIF(@bulan<10,'0'+cast(@bulan sebagai nvarchar(1)), pemeran(@bulan sebagai nvarchar(2)))+'.'; atur @[email protected]+cast(@tahun sebagai nvarchar(255)); end else if(@format=1) begin set @res=IIF(@month<10,'0'+cast(@month as nvarchar(1)), cast(@month as nvarchar(2)))+'. '; atur @[email protected]+cast(@tahun sebagai nvarchar(255)); end else if(@format=2) start 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 waktu @format int=0 // format preset)RETURNS nvarchar(255)AS/* Mengembalikan waktu sebagai string sesuai dengan format yang ditentukan dan waktu input Menyisipkan angka nol jika diperlukan:format hasil waktu input 0 17:04 "17:04:00" 1 17:04 "17:04" 1 8:04 "08:04 " 2 17:04 "17"*/MULAI MENYATAKAN @res nvarchar(255); MENYATAKAN @jam int=DATEPART(JAM, @dt); MENYATAKAN @min int=DATEPART(MINUTE, @dt); MENYATAKAN @sec int=DATEPART(SECOND, @dt); if(@format=0) start set @res=IIF(@hour<10,'0'+cast(@hour sebagai nvarchar(1)), cast(@hour sebagai nvarchar(2)))+':'; set @[email protected]+IIF(@min<10,'0'+cast(@min sebagai nvarchar(1)), cast(@min sebagai nvarchar(2)))+':'; setel @[email protected]+IIF(@sec<10,'0'+cast(@sec sebagai nvarchar(1)), cast(@sec sebagai 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 sebagai nvarchar(1)), cast(@min sebagai nvarchar(2))); end else if(@format=2) start set @res=IIF(@hour<10,'0'+cast(@hour as nvarchar(1)), cast(@hour as nvarchar(2))); akhir RETURN @res;ENDGO

[/expand]

9. Buat prosedur tersimpan yang membuat laporan HTML pada pesan dalam bentuk tabel:

[perluas judul ="Kode"]

GUNAKAN [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[GetHTMLTable] @recipients nvarchar(max) ,@dt datetime // tanggal mana yang akan dibacaASBEGIN /* menghasilkan kode HTML untuk tabel */ SET NOCOUNT; mendeklarasikan @body nvarchar(maks); deklarasikan tabel @tbl(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 (maks) ,[ERROR_PROCEDURE] nvarchar(max) ,[ERROR_POST_MESSAGE] nvarchar(max) ,[InsertDate] datetime ,[StartDate] datetime ,[FinishDate] datetime ,[Count] int ); nyatakan @ID int ,@ERROR_TITLE nvarchar(max) ,@ERROR_PRED_MESSAGE nvarchar(max) ,@ERROR_NUMBER nvarchar(max) ,@ERROR_MESSAGE nvarchar(max) ,@ERROR_LINE nvarchar(max) ,@ERROR char (maks) ,@InsertDate datetime ,@StartDate datetime ,@FinishDate datetime ,@Count int insert into @tbl( [ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSAGE] ,[ERROR_LINE_MESSADROR]_,[ERROR_LINE_MESSAGE] ] ,[InsertDate] ,[StartDate] ,[FinishDate] ,[Count] ) pilih 100 teratas [ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSAGE] ,[ERROR_LINE] ,[ERROR_PROCEDURE] ,[ERROR_POST_MESSAGE] ,[InsertDate] ,[StartDate] ,[FinishDate] ,[Count] dari [srv].[ErrorInfo] di mana ([RECIPIENTS.com@sqldats. ) atau (@recipients IS NULL) dan InsertDate'; setel @[email protected]+''; set @[email protected]+'№ /п'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'TANGGAL'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'ERROR'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'DESCRIPTION'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'KODE KESALAHAN'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'PESAN'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'MULAI'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'FINISH'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'NUMBER'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'LINE NUMBER'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'PROSEDUR'; setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+'CATATAN'; setel @[email protected]+''; setel @[email protected]+''; while((pilih top 1 1 dari @tbl)>0) start set @[email protected]+''; pilih atas 1 @ID =[ID] ,@ERROR_TITLE =[ERROR_TITLE] ,@ERROR_PRED_MESSAGE=[ERROR_PRED_MESSAGE] ,@ERROR_NUMBER =[ERROR_NUMBER] ,@ERROR_MESSAGE =[ERROR_MESSAGE] ,ROR_MESSOR_LINE =[ORCER_MESSAGE] ] ,@ERROR_POST_MESSAGE=[ERROR_POST_MESSAGE] ,@InsertDate =[InsertDate] ,@StartDate =[StartDate] ,@FinishDate =[FinishDate] ,@Count =[Count] dari @tbl dipesan oleh InsertDate asc; setel @[email protected]+''; setel @[email protected]+cast(@ID sebagai nvarchar(maks)); setel @[email protected]+''; setel @[email protected]+''; set @[email protected]+rep.GetDateFormat(@InsertDate, default)+' '+rep.GetTimeFormat(@InsertDate, default); // cast(@InsertDate sebagai nvarchar(maks)); setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+isnull(@ERROR_TITLE,''); setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+isnull(@ERROR_PRED_MESSAGE,''); setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+isnull(@ERROR_NUMBER,''); setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+isnull(@ERROR_MESSAGE,''); setel @[email protected]+''; setel @[email protected]+''; set @[email protected]+rep.GetDateFormat(@StartDate, default)+' '+rep.GetTimeFormat(@StartDate, default); //cast(@TanggalMulai sebagai nvarchar(maks)); setel @[email protected]+''; setel @[email protected]+''; set @[email protected]+rep.GetDateFormat(@FinishDate, default)+' '+rep.GetTimeFormat(@FinishDate, default); //cast(@FinishDate sebagai nvarchar(maks)); setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+cast(@Hitung sebagai nvarchar(maks)); setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+isnull(@ERROR_LINE,''); setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+isnull(@ERROR_PROCEDURE,''); setel @[email protected]+''; setel @[email protected]+''; setel @[email protected]+isnull(@ERROR_POST_MESSAGE,''); setel @[email protected]+''; hapus dari @tbl di mana [email protected]; setel @[email protected]+''; akhir set @[email protected]+''; pilih @body;ENDGO

[/expand]

10. Buat prosedur tersimpan yang mengirim pesan:

[perluas judul ="Kode"]

GUNAKAN [DATABAE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv].[RunErrorInfoProc] @IsRealTime bit =0 // mode kirim (1-waktu nyata)ASBEGIN /* kirim pemberitahuan kesalahan dengan mode yang ditentukan */ SET NOCOUNT ON; mendeklarasikan @dt datetime=getdate(); mendeklarasikan tabel @tbl(Penerima nvarchar(maks)); mendeklarasikan @penerima nvarchar(max); mendeklarasikan @penerima nvarchar(255); deklarasikan @result nvarchar(max)=''; mendeklarasikan @recp nvarchar(maks); mendeklarasikan @ind int; mendeklarasikan @recipients_key nvarchar(max); // menerima semua pesan yang diperlukan, masukkan ke @tbl(Penerima) pilih [PENERIMA] dari srv.ErrorInfo di mana InsertDate0) mulai //terima penerima pilih atas (1) @penerima=Penerima dari @tbl; setel @[email protected]; setel @hasil=''; // untuk setiap penerima while(len(@recipients)>0) start set @ind=CHARINDEX(';', @recipients); if(@ind>0) start set @recipient=substring(@recipients,1, @ind-1); set @penerima=substring(@penerima,@ind+1,len(@penerima)[email protected]); end else start set @[email protected]; setel @penerima=''; akhir; // menerima email penerima 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) setel @[email protected]; akhir // dipisahkan dengan simbol ';' setel @[email protected]@sqldat.com+';'; set akhir @hasil=substring(@hasil,1,len(@hasil)-1); setel @[email protected]; // terima laporan HTML dengan penerima yang ditentukan dan masukkan tanggal ke @rec_body(Body) exec srv.GetHTMLTable @[email protected]_key, @[email protected]; // menerima laporan HTML pilih atas (1) @body=Body dari @rec_body; // pengiriman sebenarnya EXEC msdb.dbo.sp_send_dbmail // mengirim email ke profil admin yang kami buat @profile_name ='ALARM', //email penerima @penerima =@penerima, // teks pesan @body =@body, // Subject @subject =N'INFORMATION ON EXECUTION ERRORS', @body_format='HTML'--, // Sebagai contoh, mari tambahkan hasil query SQL acak ke pesan [email protected] =@query--'SELECT TOP 10 nama DARI sys.objects'; hapus dari @tbl di mana [email protected]_key; hapus dari @rec_body; end // arsipkan pesan terkirim INSERT INTO [srv].[ErrorInfoArchive] ([ErrorInfo_GUID] ,[ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSAGE] ,[ERROR_PRED_MESSAGE] ,[ERROR_POST_ ,[ERROR_POST_ PENERIMA] ,[Tanggal Mulai] ,[Tanggal Selesai] ,[Hitung] ,Waktu Nyata ) SELECT [ErrorInfo_GUID] ,[ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSAGE] ,[ERROR_MESSAGE] ,[ERROR_MESSAGE] [PENERIMA] ,[StartDate] ,[FinishDate] ,[Count] ,IsRealTime FROM [srv].[ErrorInfo] di mana [email protected] dan InsertDate 

[/expand]

Prosedur tersimpan ini mengambil setiap pesan dari antrian pesan dan membungkusnya dalam laporan HTML dalam bentuk tabel. Untuk penerima, berdasarkan kode atau alamat email utama mereka, ini membuat string yang terdiri dari alamat email, yang menjadi tujuan pengiriman pesan. Dengan cara ini, semua pesan yang dipilih diproses. Di sini, prosedur tersimpan msdb.dbo.sp_send_dbmail digunakan.

11. Buat dua tugas di Agen (yang pertama untuk notifikasi waktu nyata (jadwalkan 1 kali per menit), yang kedua untuk notifikasi sederhana (jadwalkan 1 kali per jam)). Tambahkan kode berikut ke kode tugas:

JALANKAN [DATABASE_NAME].[srv].[RunErrorInfoProc] @IsRealTime=0; // 0 - untuk pesan sederhana dan 1 - untuk pesan waktu nyata

Berikut adalah contoh pelaporan kesalahan:

[expand title="Kode"]

mulai coba exec [DATABASE_NAME].[srv].[KillFullOldConnect];end trybegin catch mendeklarasikan @str_mess nvarchar(max)=ERROR_MESSAGE(), @str_num nvarchar(max)=cast(ERROR_NUMBER() sebagai nvarchar(max) ), @str_line nvarchar(max)=cast(ERROR_LINE() as nvarchar(max)), @str_proc nvarchar(max)=ERROR_PROCEDURE(), @str_title nvarchar(max)='DELETING NON-RESPONDING PROCESSES PADA SERVER 'contoh @sqldat.com@servername, @str_pred_mess nvarchar(max)='KESALAHAN PENGHAPIAN PROSES NON-RESPONDING TERJADI PADA SERVER '[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_ORCEDURE =@str_strOR_LINE =@pro_,PROCEDUR PENERIMA ='PENERIMA1;PENERIMA2'; mendeklarasikan @err [email protected]@error; raiserror(@str_mess,16,1);akhiri tangkapan

[/expand]

Di sini, prosedur tersimpan svr.KillFullOldConnect digunakan.

Hasil

Artikel ini menyertakan contoh perluasan fungsionalitas Database Mail reguler dan contoh cara membuat notifikasi dalam tabel HTML dan mengirimkannya melalui email ke administrator. Pendekatan ini memungkinkan administrator memberi tahu administrator tentang masalah yang berbeda secara real time atau setelah waktu tertentu, sehingga meminimalkan terjadinya masalah kritis dan kegagalan DBMS dan server, yang pada gilirannya melindungi produksi dari penundaan alur kerja.

Referensi:

  1. Sp_send_dbmail
  2. Email Basis Data
  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. mengisolasi sub-string dalam string sebelum simbol di SQL Server 2008

  2. Buat tampilan dengan klausa ORDER BY

  3. Cara Mengubah Skema Objek (Tabel, Tampilan, Prosedur Tersimpan) di Database SQL Server - Tutorial SQL Server / TSQL Bagian 28

  4. Prosedur tersimpan T-SQL yang menerima beberapa nilai Id

  5. Tabel Pivot dan Kolom Gabungan