परिचय
अक्सर, सर्वर की समस्याओं के बारे में प्रशासकों को किसी तरह सूचित करने की आवश्यकता होती है। सूचनाएं आम तौर पर 2 प्रकारों में विभाजित होती हैं:
1) रीयल-टाइम सूचनाएं, यानी वे जो कोई समस्या होने पर तुरंत आनी चाहिए
2) विलंबित सूचनाएं, यानी वे जो काफी लंबे समय (1 घंटे से अधिक) के बाद किसी समस्या के होने के बाद आती हैं।
मेरे काम में, नियमित SQL सर्वर डेटाबेस मेल की कार्यक्षमता का विस्तार करना आवश्यक था।
इस लेख में, हम एक उदाहरण पर विचार करेंगे कि HTML तालिकाओं में सूचनाएं कैसे उत्पन्न करें और फिर उन्हें व्यवस्थापकों को कैसे भेजें।
समाधान
<पी संरेखित करें ="बाएं"> 1। डेटाबेस मेल कॉन्फ़िगर करें <पी संरेखित करें ="बाएं"> 2। प्राप्तकर्ताओं के लिए एक तालिका बनाएं:[शीर्षक का विस्तार करें ="कोड"]
उपयोग [डेटाबेस_नाम] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। [प्राप्तकर्ता] ( [प्राप्तकर्ता_GUID] [अद्वितीय पहचानकर्ता] ROWGUIDCOL शून्य नहीं, [प्राप्तकर्ता_नाम] [nvarchar] (255) एक प्राप्तकर्ता प्राथमिक ईमेल नहीं [// Recipient_Code] [nvarchar](10) NOT NULL, // प्राप्तकर्ता का कोड [IsDeleted] [बिट] नॉट NULL, // एक डिलीट इंडिकेटर (प्राप्तकर्ता का उपयोग किया गया है या नहीं) [InsertUTCDate] [डेटाटाइम] नॉट न्यूल, कॉन्स्ट्रेंट [PK_Recipient ] प्राथमिक कुंजी क्लस्टर ( [प्राप्तकर्ता_जीयूआईडी] एएससी) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =UNMARY] [SCNSINT] CONSIENTERED_ALOW_LOCKS =UNMARY] NCode] CONSI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [प्राथमिक], CONSTRAINT [AK_Recipient_Name] UNIQUE F, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [प्राथमिक]) ऑन [प्राथमिक]गोलटर टेबल [srv]। srv]।[/expand]
<पी संरेखित करें ="बाएं"> 3। प्राप्तकर्ताओं के पतों के लिए एक तालिका बनाएं:[शीर्षक का विस्तार करें ="कोड"]
उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। [पता] ([पता_GUID] [अद्वितीय पहचानकर्ता] ROWGUIDCOL शून्य नहीं, [प्राप्तकर्ता_GUID] [अद्वितीय पहचानकर्ता] नहीं, // प्राप्तकर्ता [पता] [अद्वितीय पहचानकर्ता] 255) नॉट न्यूल, // ईमेल [डिलीट किया गया] [बिट] नॉट न्यूल, // डिलीट इंडिकेटर (ईमेल का उपयोग किया गया है या नहीं) [इन्सर्टयूटीसीडेट] [डेटाटाइम] नॉट न्यूल, कॉन्स्ट्रेंट [पीके_एड्रेस] प्राथमिक कुंजी क्लस्टर ( [पता_गाइड] एएससी ) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [PRIMARY], CONSTRAINT [AK_Address] UNIQUE [ADC [Address, [Address] UNIQUE NONCLUSTERED] , STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [प्राथमिक]) ऑन [PRIMARY]GOALTER TABLE [srv]। गोल्टर टेबल [ srv]।[/expand]
<पी संरेखित करें ="बाएं"> 4। संदेश कतार के लिए एक तालिका बनाएं:[शीर्षक का विस्तार करें ="कोड"]
उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। [ErrorInfo] ([ErrorInfo_GUID] [अद्वितीय पहचानकर्ता] न्यूल नहीं, [ERROR_TITLE] [nvarchar] (अधिकतम) NULL, // शीर्षक [ERROR_] (अधिकतम) NULL, // प्रारंभिक जानकारी [ERROR_NUMBER] [nvarchar] (अधिकतम) NULL, // संदेश (त्रुटि) कोड [ERROR_MESSAGE] [nvarchar] (अधिकतम) NULL, // संदेश [ERROR_LINE] [nvarchar] (अधिकतम) NULL, // लाइन नंबर [ERROR_PROCEDURE] [nvarchar] (अधिकतम) NULL, // संग्रहित प्रक्रिया [ERROR_POST_MESSAGE] [nvarchar] (अधिकतम) NULL, // व्याख्यात्मक जानकारी [प्राप्तकर्ता] [nvarchar] (अधिकतम) NULL, // प्राप्तकर्ता ';' द्वारा अलग किया गया [इन्सर्टडेट] [डेटाटाइम] न्यूल नहीं, [स्टार्टडेट] [डेटटाइम] न्यूल नहीं, // डेटा और समय शुरू करें [फिनिशडेट] [डेटाटाइम] नॉट न्यूल, // खत्म होने की तारीख और समय [गणना] [इंट] न्यूल नहीं, // बार की संख्या [अपडेटडेट] [डेट etime] नॉट न्यूल, [IsRealTime] [बिट] नॉट न्यूल, // रियल टाइम इंडिकेटर [InsertUTCDate] [डेटाटाइम] न्यूल, कंस्ट्रेंट [PK_ErrorInfo] प्राथमिक कुंजी क्लस्टर ([ErrorInfo_GUID] ASC) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [PRIMARY]) ऑन [प्राथमिक] TEXTIMAGE_ON [PRIMARY]GOALTER टेबल [srv]। तालिका [srv]। [ErrorInfo] बाधा जोड़ें [DF_ErrorInfo_InsertDate] डिफ़ॉल्ट (getdate ()) [InsertDate] GOALTER TABLE [srv] के लिए। srv]। [ErrorInfo] [DF_ErrorInfo_FinishDate] DEFAULT (getdate ()) [FinishDate] GOALTER TABLE [srv] के लिए जोड़ें। .[ErrorInfo] बाधा जोड़ें [DF__ErrorInfo__Updat__5FFEE747] DEFAU [अपडेटडेट] गोल्टर टेबल [एसआरवी] के लिए एलटी (गेटडेट ())। getutcdate ()) के लिए [insertUTCDate]GO[/expand]
<पी संरेखित करें ="बाएं"> 5। संदेश कतार से भेजे गए संदेशों के लिए एक संग्रह तालिका बनाएं:[शीर्षक का विस्तार करें ="कोड"]
उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE तालिका [srv]। ) न्यूल, [ERROR_NUMBER] [nvarchar](अधिकतम) NULL, [ERROR_MESSAGE] [nvarchar](max) NULL, [ERROR_LINE] [nvarchar](max) NULL, [ERROR_PROCEDURE] [nvarchar](max) NULL, [ERROR_POST_MESSAGE] [nvarchar] (अधिकतम) NULL, [प्राप्तकर्ता] [nvarchar] (अधिकतम) NULL, [इन्सर्टडेट] [डेटाटाइम] नॉट न्यूल, [स्टार्टडेट] [डेटाटाइम] नॉट न्यूल, [फिनिशडेट] [डेटाटाइम] नॉट न्यूल, [गणना] [ int] न्यूल नहीं, [अपडेटडेट] [डेटाटाइम] न्यूल नहीं, [IsRealTime] [बिट] न्यूल नहीं, [InsertUTCDate] [डेटाटाइम] न्यूल, कॉन्स्ट्रेंट [PK_ArchiveErrorInfo] प्राथमिक कुंजी क्लस्टर ([ErrorInfo_GUID] ASC) के साथ (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ऑन [प्राथमिक]) ऑन [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOALTE आर टेबल [srv]। [ErrorInfoArchive] CONSTRAINT जोड़ें [DF_ErrorInfoArchive_ErrorInfo_GUID] DEFAULT (newsequentialid ()) [ErrorInfo_GUID] GOALTER TABLE [srv] के लिए। [srv]. ]. [ErrorInfoArchive] [अपडेटडेट] GOALTER TABLE के लिए CONSTRAINT [DF_ErrorInfoArchive_Count] DEFAULT ((1)) [गणना] GOALTER TABLE [srv] के लिए जोड़ें। [ErrorInfoArchive] CONSTRAINT जोड़ें [DF_ErrorInfoArchive_IsRealTime] [IsRealTime]GOALTER TABLE [srv] के लिए डिफ़ॉल्ट ((0))। पुन>[/expand]
इतिहास के लिए यह जानकारी आवश्यक है। इसके अलावा, इस तालिका को बहुत पुराने डेटा (उदाहरण के लिए, एक महीने से अधिक पुराने) से साफ़ करने की आवश्यकता है।
<पी संरेखित करें ="बाएं"> 6। एक संग्रहीत कार्यविधि बनाएं जो संदेश कतार में एक नया संदेश पंजीकृत करे:[शीर्षक का विस्तार करें ="कोड"]
उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]। nvarchar(max), @ERROR_PROCEDURE nvarchar(max), @ERROR_POST_MESSAGE nvarchar(max), @RECIPIENTS nvarchar(max), @StartDate datetime=null, @FinishDate datetime=null, @IsRealTime bit =0ASBEGIN /* त्रुटि लॉगिंग में त्रुटि ईमेल द्वारा भेजी जाने वाली तालिका यदि तालिका में पहले से ही समान शीर्षक, सामग्री और प्रेषक के साथ एक प्रविष्टि है, त्रुटि की समाप्ति तिथि, रिकॉर्ड अपडेट की तिथि, साथ ही त्रुटियों की संख्या बदल जाएगी */ NOCOUNT सेट करें पर; @ErrorInfo_GUID अद्वितीय पहचानकर्ता घोषित करें; srv.ErrorInfo से शीर्ष 1 @ErrorInfo_GUID=ErrorInfo_GUID चुनें जहां ([email protected]_TITLE या @ERROR_TITLE शून्य है) और [email protected] और ([email protected]_MESSAGE या @ERROR_MESSAGE शून्य है) और ([email protected]_PRED_MESSAGE) या @ERROR_PRED_MESSAGE शून्य है) और ([email protected]_POST_MESSAGE या @ERROR_POST_MESSAGE शून्य है) और ([email protected] या @IsRealTime शून्य है); अगर (@errorinfo_guid null है) SRV.ErrorInfo (Error_title, Error_pred_message, error_number, error_number, error_message, error_line, error_procedure, error_post_message, @mestror, @mersage, isrealtime, @merror_mest, select, startdate) में डालें ERROR_LINE,@ERROR_PROCEDURE,@ERROR_POST_MESSAGE,@RECIPIENTS,@IsRealTime,isnull(@StartDate, getdate()) ,isnull(@FinishDate,getdate()) अंत में अपडेट शुरू करें srv.ErrorInfo सेट FinishDate=getdate(), [Count]=[Count]+1, UpdateDate=getdate() जहां [email protected]_GUID; endENDGO[/expand]
<पी संरेखित करें ="बाएं"> 7। एक संग्रहीत कार्यविधि बनाएं जो कोड या प्राप्तकर्ता के प्राथमिक ईमेल पते द्वारा पतों से एक स्ट्रिंग लौटाए:[शीर्षक का विस्तार करें ="कोड"]
उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]। ईमेल सूचनाएं बनाना*/ASBEGIN SET NOCOUNT ON; सेट @ प्राप्तकर्ता =''; @[email protected]+d चुनें.[पता]+';' srv.Recipient से r इनर ज्वाइन srv। r.IsDeleted=0 और d.IsDeleted=0; --आदेश r.InsertUTCDate desc, d.InsertUTCDate desc; if(len(@Recipients)>0) set @Recipients=substring(@Recipients,1,len(@Recipients)-1);ENDGO[/expand]
<पी संरेखित करें ="बाएं"> 8। दिनांक और समय के साथ कार्य करने के लिए आवश्यक कार्य बनाएँ:[शीर्षक का विस्तार करें ="कोड"]
उपयोग [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [प्रतिनिधि]। [GetDateFormat] ( @dt datetime, // input date @format int=0 // प्रीसेट फॉर्मेट) रिटर्न 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) start set @res=IIF(@day<10,'0'+cast(@day as nvarchar(1)), Cast(@day as nvarchar(2)))+'.'; सेट @[email protected]+IIF(@month<10,'0'+cast(@month as nvarchar(1)), cast(@month as nvarchar(2)))+'.'; सेट @[email protected]+cast(@year as nvarchar(255)); अंत में अगर(@format=1) @res=IIF(@month<10,'0'+cast(@month as nvarchar(1)), cast(@month as nvarchar(2)))+' सेट करना शुरू करें। '; सेट @[email protected]+cast(@year as nvarchar(255)); अंत में अगर(@format=2) @res=cast(@year as nvarchar(255)) सेट करना शुरू करें; अंत वापसी @res;ENDGOUSE [DATABASE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE FUNCTION [प्रतिनिधि]। [GetTimeFormat] ( @dt डेटाटाइम, // इनपुट समय @format int =0 // प्रीसेट प्रारूप) रिटर्न nvarchar (255) AS/* रिटर्न निर्दिष्ट प्रारूप के अनुसार एक स्ट्रिंग के रूप में समय और इनपुट समय जहां आवश्यक हो वहां शून्य डालें:प्रारूप इनपुट समय परिणाम 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); DECLARE @hour int=DATEPART(HOUR, @dt); DECLARE @min int=DATEPART(MINUTE, @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)))+':'; सेट @[email protected]+IIF(@min<10,'0'+cast(@min as nvarchar(1)), कास्ट(@min as nvarchar(2)))+':'; सेट @[email protected]+IIF(@sec<10,'0'+cast(@sec as nvarchar(1)), कास्ट(@sec as nvarchar(2))); अंत में अगर(@format=1) @res=IIF(@hour<10,'0'+cast(@hour as nvarchar(1)), cast(@hour as nvarchar(2)))+' सेट करना शुरू करें:'; सेट @[email protected]+IIF(@min<10,'0'+cast(@min as nvarchar(1)), कास्ट(@min as nvarchar(2))); अंत में अगर(@format=2) शुरू सेट @res=IIF(@hour<10,'0'+cast(@hour as nvarchar(1)), Cast(@hour as nvarchar(2))); अंत वापसी @res;ENDGO[/expand]
9. एक तालिका के रूप में संदेशों पर एक HTML रिपोर्ट बनाने वाली संग्रहीत कार्यविधि बनाएं:
[शीर्षक का विस्तार करें ="कोड"]
उपयोग [DATABASE_NAME]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]।[GetHTMLTable] @recipients nvarchar(max) ,@dt datetime // किस तारीख तक पढ़ना हैASBEGIN /* टेबल के लिए HTML-SET NOCOUNT ON जेनरेट करता है */; @body nvarchar (अधिकतम) घोषित करें; @tbl तालिका घोषित करें (आईडी int पहचान (1,1), [ERROR_TITLE] nvarchar (अधिकतम), [ERROR_PRED_MESSAGE] nvarchar (अधिकतम), [ERROR_NUMBER] nvarchar (अधिकतम), [ERROR_MESSAGE] nvarchar (अधिकतम), [ERROR_LINE] (अधिकतम), [ERROR_PROCEDURE] nvarchar (अधिकतम), [ERROR_POST_MESSAGE] nvarchar (अधिकतम), [InsertDate] डेटाटाइम, [StartDate] डेटाटाइम, [FinishDate] डेटाटाइम, [गणना] int); @ID int, @ERROR_TITLE nvarchar (अधिकतम), @ERROR_PRED_MESSAGE nvarchar (अधिकतम), @ERROR_NUMBER nvarchar (अधिकतम), @ERROR_MESSAGE nvarchar (अधिकतम), @ERROR_LINE, nvarchar (अधिकतम)_, @varRORmax) घोषित करें। (अधिकतम) @InsertDate datetime,@StartDate datetime,@FinishDate datetime,@tbl([ERROR_TITLE], [ERROR_PRED_MESSAGE], [ERROR_NUMBER], [ERROR_MESSAGE] _, [_ERROR_LINE], [ERROR_LINE] में इंट इंसर्ट की गणना करें। ] ,[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] [srv] से। ) या (@recipients IS NULL) और InsertDate'; @example@sqldat.com+' ' सेट करें; @[email protected]+' ' सेट करें; जबकि((@tbl से शीर्ष 1 1 का चयन करें)>0) @[email protected]+'' सेट करें; @[email protected]+'№ /п' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'DATE' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'ERROR' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'विवरण' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'ERROR CODE' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'MESSAGE' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'START' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'फिनिश' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'NUMBER' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'लाइन नंबर' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'प्रक्रिया' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; @[email protected]+'नोट' सेट करें; @[email protected]+' ' सेट करें; @[email protected]+'' सेट करना शुरू करें; शीर्ष 1 चुनें @ID =[ID] ,@ERROR_TITLE =[ERROR_TITLE] ,@ERROR_PRED_MESSAGE=[ERROR_PRED_MESSAGE] ,@ERROR_NUMBER =[ERROR_NUMBER] ,@ERROR_MESSAGE =[ERROR_ERROR_PROCE_LINE,[DURER_MESSAGE =[ERROR_ERROR_PROCEAGE], @ERROR_MESSAGE =[ERROR_ERROR_PROCEAGE], ] ,@ERROR_POST_MESSAGE=[ERROR_POST_MESSAGE] ,@InsertDate=[InsertDate] ,@StartDate=[StartDate] ,@FinishDate=[FinishDate] ,@Count=[Count] इन्सर्टडेट एएससी द्वारा @tbl ऑर्डर से; @[email protected]+' ' सेट करें; अंतिम सेट @[email protected]+''; @body चुनें;ENDGO' सेट करें; सेट @[email protected]+cast(@ID as nvarchar(max)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+rep.GetDateFormat(@InsertDate, default)+' '+rep.GetTimeFormat(@InsertDate, default); // कास्ट (@InsertDate as nvarchar(max)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+isnull(@ERROR_TITLE,''); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+isnull(@ERROR_PRED_MESSAGE,''); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+isnull(@ERROR_NUMBER,''); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+isnull(@ERROR_MESSAGE,''); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+rep.GetDateFormat(@StartDate, default)+' '+rep.GetTimeFormat(@StartDate, default); // कास्ट (@StartDate as nvarchar(max)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+rep.GetDateFormat(@FinishDate, default)+' '+rep.GetTimeFormat(@FinishDate, default); // कास्ट (@FinishDate as nvarchar(max)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+cast(@Count as nvarchar(max)); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+isnull(@ERROR_LINE,''); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+isnull(@ERROR_PROCEDURE,''); @[email protected]+' ' सेट करें; @[email protected]+'' सेट करें; सेट @[email protected]+isnull(@ERROR_POST_MESSAGE,''); @[email protected]+' ' सेट करें; @tbl से हटाएं जहां [email protected]; @[email protected]+'[/expand]
10. संदेश भेजने वाली एक संग्रहीत कार्यविधि बनाएं:
[शीर्षक का विस्तार करें ="कोड"]
उपयोग [DATABAE_NAME] GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [srv]। [RunErrorInfoProc] @IsRealTime bit =0 // मोड भेजें (1-रियल टाइम) ASBEGIN /* निर्दिष्ट मोड के साथ त्रुटि सूचनाएं भेजें */ NOCOUNT ON सेट करें; @dt datetime=getdate() घोषित करें; @tbl तालिका घोषित करें (प्राप्तकर्ता nvarchar (अधिकतम)); @प्राप्तकर्ता घोषित करें nvarchar(max); @प्राप्तकर्ता nvarchar (255) घोषित करें; @result घोषित करें nvarchar(max)=''; @recp nvarchar (अधिकतम) घोषित करें; @ind int घोषित करें; @recipients_key nvarchar (अधिकतम) घोषित करें; // @tbl (प्राप्तकर्ता) में सम्मिलित सभी आवश्यक संदेश प्राप्त करें srv.ErrorInfo से [प्राप्तकर्ता] का चयन करें जहां [प्राप्तकर्ता] द्वारा InsertDate0) प्रारंभ // प्राप्त प्राप्तकर्ता शीर्ष का चयन करें (1) @ प्राप्तकर्ता =@tbl से प्राप्तकर्ता; @[email protected] सेट करें; सेट @ परिणाम =''; // प्रत्येक प्राप्तकर्ता के लिए जबकि(len(@recipients)>0) start set @ind=CHARINDEX(';', @recipients); if(@ind>0) start set @recipient=substring(@recipients,1,@ind-1); सेट @ प्राप्तकर्ता =सबस्ट्रिंग(@प्राप्तकर्ता,@इंड+1,लेन(@प्राप्तकर्ता)[email protected]); अंत में @[email protected] सेट करना शुरू करें; सेट @प्राप्तकर्ता =''; अंत; // प्राप्तकर्ता ईमेल प्राप्त करें [srv] निष्पादित करें। [GetRecipients] @[email protected], @[email protected] आउट; if(len(@recp)=0) निष्पादन शुरू करें [srv]। [GetRecipients] @[email protected], @[email protected] आउट; if(len(@recp)=0) @[email protected] सेट करें; अंत // प्रतीक द्वारा अलग किया गया ';' सेट @[email protected]@sqldat.com+';'; अंत सेट @ परिणाम =सबस्ट्रिंग (@ परिणाम, 1, लेन (@ परिणाम) -1); @[email protected] सेट करें; // निर्दिष्ट प्राप्तकर्ताओं के साथ HTML-रिपोर्ट प्राप्त करें और दिनांक डालें @rec_body(Body) exec srv.GetHTMLTable @[email protected]_key, @[email protected]; // HTML-रिपोर्ट प्राप्त करें शीर्ष चुनें (1) @body=body from @rec_body; // वास्तविक भेजने वाला EXEC msdb.dbo.sp_send_dbmail // ईमेल व्यवस्थापक प्रोफ़ाइल जिसे हमने बनाया है @subject =N'INFORMATION ON EXECUTION ERRORS', @body_format='HTML'--, // उदाहरण के लिए, आइए संदेश में यादृच्छिक SQL क्वेरी के परिणाम जोड़ते हैं [email protected] =@query--'Select TOP sys.objects से 10 नाम'; @tbl से हटाएं जहां [email protected]_key; @rec_body से हटाएं; अंत // भेजे गए संदेशों को संग्रहीत करें INSERT INTO [srv]। प्राप्तकर्ता] ,[प्रारंभ दिनांक] ,[समाप्त तिथि] ,[गणना] ,IsRealTime ) चुनें [ErrorInfo_GUID] ,[ERROR_TITLE] ,[ERROR_PRED_MESSAGE] ,[ERROR_NUMBER] ,[ERROR_MESSER_DUR_ ], [ERROR_MESSER_ ] , [प्राप्तकर्ता], [स्टार्टडेट], [फिनिशडेट], [गणना], IsRealTime [srv] से। // भेजे गए संदेशों को संदेश कतार से हटाएं [srv] से हटाएं। [ErrorInfo] जहां [email protected] और InsertDate [/expand]
यह संग्रहीत कार्यविधि संदेश कतार से प्रत्येक संदेश को लेती है और इसे एक HTML रिपोर्ट में एक तालिका के रूप में लपेटती है। प्राप्तकर्ताओं के लिए, उनके कोड या प्राथमिक ईमेल पते के आधार पर, यह ईमेल पतों से युक्त एक स्ट्रिंग बनाता है, जिस पर एक संदेश भेजा जाता है। इस तरह, सभी चयनित संदेशों को संसाधित किया जाता है। यहां, msdb.dbo.sp_send_dbmail संग्रहीत कार्यविधि का उपयोग किया जाता है।
11. एजेंट में दो कार्य बनाएं (पहला एक रीयल-टाइम नोटिफिकेशन के लिए है (प्रति मिनट 1 बार शेड्यूल करें), दूसरा साधारण नोटिफिकेशन के लिए है (प्रति घंटे 1 बार शेड्यूल करें))। कार्य के कोड में निम्नलिखित जोड़ें:
निष्पादित करें [DATABASE_NAME]। [srv]। [RunErrorInfoProc] @IsRealTime=0; // 0 - साधारण संदेशों के लिए और 1 - रीयल-टाइम संदेशों के लिएत्रुटि रिपोर्टिंग का एक उदाहरण यहां दिया गया है:
[शीर्षक का विस्तार करें ="कोड"]
प्रयास करें [DATABASE_NAME]। [srv]। ), @str_line nvarchar(max)=cast(ERROR_LINE() as nvarchar(max)), @str_proc nvarchar(max)=ERROR_PROCEDURE(), @str_title nvarchar(max)='SERVER पर गैर-प्रतिक्रिया प्रक्रियाओं को हटाना' उदाहरण @ sqldat.com@servername, @str_pred_mess nvarchar(max)=''[email protected]@servername+' सर्वर' पर गैर-प्रतिक्रिया प्रक्रियाओं का विलोपन त्रुटि हुई; निष्पादन [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_proc, @str_PRODE प्राप्तकर्ता ='प्राप्तकर्ता1; प्राप्तकर्ता2'; @err घोषित करें [email protected]@error; raiserror(@str_mess,16,1);अंतिम पकड़[/expand]
यहां, svr.KillFullOldConnect संग्रहीत कार्यविधि का उपयोग किया जाता है।
परिणाम
इस आलेख में एक नियमित डेटाबेस मेल की कार्यक्षमता का विस्तार करने का एक उदाहरण और HTML तालिकाओं में सूचनाएं उत्पन्न करने और फिर उन्हें व्यवस्थापकों को ईमेल करने का एक उदाहरण शामिल है। यह दृष्टिकोण वास्तविक समय में या एक निश्चित समय के बाद प्रशासकों को विभिन्न समस्याओं के बारे में सूचित करने की अनुमति देता है, जिससे एक गंभीर समस्या की घटना को कम किया जा सकता है और डीबीएमएस और सर्वर की विफलता, जो बदले में उत्पादन को वर्कफ़्लो विलंब से बचाता है।
संदर्भ:
- Sp_send_dbmail
- डेटाबेस मेल
- Srv.KillFullOldConnect