[SQL SERVER]快速建立SMS系統警示機制(使用簡訊王)

[SQL SERVER]快速建立SMS系統警示機制(使用簡訊王)

現在這年代,沒有智慧型手機是一件很不可思議的事情,

但大部分公司配給員工手機幾乎都不是智慧型手機(我以前公司配給我Nokia 3100),

你要知道身為一位專業DBA和主要系統負責人就要有不關機的覺悟(但接不接又是另一回事~XD),

當時主管告訴我企業方案通話費每月129(這是員工睡不飽老闆住帝寶的企業方案~~誤),

內心我就燃起要把正示環境的DB和AP相關警示作業(如記憶體、硬碟..等)都給加上SMS通知方式,

所以我開始思考,什麼樣的方式可以最快達到目的且夠省成本,

以公司手機都走復古風格來看,叫公司花錢買一套完整簡訊平台(含國內外、不分網內外)鐵定打槍,

我拜G大神後發現一家還不錯的簡訊廠商(簡訊王--不分國內外、網內外馬上吸引我目光),

而且也符合我對國外簡訊需求(我門有分公司在美國、荷蘭、大陸..等),

同時該廠商也很貼心提供了API介接的詳細說明(也可參考MVP Nobel的自製DLL),

我為了不想額外寫發送紀錄,所以我決定使用SSIS2012並透過SQL Agent Job來完成我的SMS系統警示機制。

 

一、申請簡訊王會員

送20點先試用看看,好用在購買,每則不超過1元,失敗還不用錢。

 

二、即時發送簡訊

簡訊王提供即時和大量API發送速度,且發送速度都算滿快的,

我這裡使用即時發送並簡單包了一個function(詳細可參考簡訊王API)。

 

建立SSIS專案並使用指令碼元件

image

 

建立變數

image

到時我可以指定目的手機號碼

 

指定讀寫變數

image

 

 

判斷硬碟可用空間小於總空間*20%就發送警示簡訊

//簡訊王發送Function

private string SendInTime(string userid, string pwd, string dstanumber, string smsbody)
       {
           Encoding myenc = Encoding.GetEncoding("big5");
           string smsurl =
               string.Format(@"http://202.39.48.216/kotsmsapi-1.php?username={0}&password={1}&dstaddr={2}&smbody={3}"
               , userid, pwd, dstanumber, HttpUtility.UrlEncode(smsbody, myenc));
           HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(smsurl);
           req.Method = "GET";
           using (WebResponse wr = req.GetResponse())
           {
               using (StreamReader sr = new StreamReader(wr.GetResponseStream(), myenc))
               {
                   return sr.ReadToEnd();
               }
           }   
       }

 

private string ParserCode(string code)
        {
            string replacement = Regex.Replace(code, @"\t|\n|\r|kmsgid=", "");
            string content = "";        
            switch (replacement)
            {
                case "-1":
                    content = @"CGI string error ,系統維護中或其他錯誤 ,帶入的參數異常,伺服器異常";
                    break;
                case "-2":
                    content = @"授權錯誤(帳號/密碼錯誤)";
                    break;
                case "-4":
                    content = @"A Number違反規則 發送端 870短碼VCSN 設定異常";
                    break;
                case "-5":
                    content = @"B Number違反規則 接收端 門號錯誤";
                    break;
                case "-6":
                    content = @"Closed User 接收端的門號停話異常090 094 099 付費代號等";
                    break;
                case "-20":
                    content = @"Schedule Time錯誤 預約時間錯誤 或時間已過";
                    break;
                case "-21":
                    content = @"Valid Time錯誤 有效時間錯誤";
                    break;
                case "-59999":
                    content = @"帳務系統異常 簡訊無法扣款送出";
                    break;
                case "-60002":
                    content = @"點數不足";
                    break;
                case "-60014":
                    content = @"該用戶已申請 拒收簡訊平台之簡訊 ( 2010 NCC新規)";
                    break;
                default:
                    break;
            }
            return content;
        }

 

SSIS EntryPoint(示範發送目前硬碟總空間和可用空間)

public void Main()
        {
            // TODO: Add your code here
            StringBuilder sb = new StringBuilder();
            DriveInfo[] allDrives = DriveInfo.GetDrives();
            foreach (DriveInfo d in allDrives)
            {
                if (d.IsReady)
                {
                    sb.AppendLine(string.Format("{0}: 總共空間(GB):{1} , 可用空間(GB):{2}",
                        d.Name, d.TotalSize / (1024 * 1024 * 1024), d.TotalFreeSpace / (1024 * 1024*1024)));
                    //if ((d.TotalSize * 0.2) <= d.TotalFreeSpace)
                    //{
                    //    sb.AppendLine(string.Format("{0}: 總共空間(GB):{1} , 可用空間(GB):{2}",
                    //      d.Name, d.TotalSize / (1024 * 1024 * 1024), d.TotalFreeSpace / (1024 * 1024 * 1024)));
                    //}                               
                }           
            }
            if (sb.ToString().Length > 0)
            {
                //使用簡訊王API
                string message = ParserCode(SendInTime("***", "***", Dts.Variables["PhoneNumber"].Value.ToString(), sb.ToString()));
                bool fireAgain = true;
                if (message.Length > 0)
                {
                    Dts.Events.FireError(0, "硬碟空間不足,簡訊發送失敗",
                        string.Format("簡訊發送失敗代碼:{0}", message), "", 0);
                    Dts.TaskResult = (int)ScriptResults.Failure;
                }
                else
                {
                    Dts.Events.FireInformation(0, Dts.Variables["System::TaskName"].Value.ToString()
                        , "硬碟空間正常", "", 0, ref fireAgain);
                    Dts.TaskResult = (int)ScriptResults.Success;
                }
            }
            else
            {
                Dts.TaskResult = (int)ScriptResults.Success;
            }               
        }

 

三、Deploy SSIS to SQL Server usingSQL Agent Job

image

 

設定作業步驟

image

 

指定目的手機號碼

\Package.variables[User::PhoneNumber].Properties[Value]

image

 

 

設定作業排成

image

我設定每5分鐘檢查一次硬碟。

 

 

測試

image

 

image

透過SMS讓我的復古手機也可以收到系統警示。

 

ps:所有簡訊發送紀錄,簡訊王平台已有提供,也可下載喔。