[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專案並使用指令碼元件
建立變數
到時我可以指定目的手機號碼。
指定讀寫變數
判斷硬碟可用空間小於總空間*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
設定作業步驟
指定目的手機號碼
\Package.variables[User::PhoneNumber].Properties[Value]
設定作業排成
我設定每5分鐘檢查一次硬碟。
測試
透過SMS讓我的復古手機也可以收到系統警示。
ps:所有簡訊發送紀錄,簡訊王平台已有提供,也可下載喔。