蘇同建
【摘要】不同數(shù)據(jù)庫之間的數(shù)據(jù)自動(dòng)同步及寫入功能作為數(shù)據(jù)庫應(yīng)用中比較重要的一項(xiàng)功能一直為大家所重視,本文通過一個(gè)利用觸發(fā)器實(shí)現(xiàn)煤礦瓦斯數(shù)據(jù)中斷后自動(dòng)發(fā)送短信提醒的實(shí)例展示如何實(shí)現(xiàn)自動(dòng)對(duì)遠(yuǎn)程數(shù)據(jù)庫寫入數(shù)據(jù)記錄一個(gè)獨(dú)特的方法,通過對(duì)此方法的探討為大家提供一種新穎的思路。
【關(guān)鍵詞】煤礦企業(yè);觸發(fā)器;遠(yuǎn)程數(shù)據(jù)庫;寫入數(shù)據(jù);短信提醒
一家大型煤炭企業(yè),下屬十多個(gè)煤礦,該煤炭企業(yè)有煤礦安全生產(chǎn)實(shí)時(shí)監(jiān)測(cè)與監(jiān)管系統(tǒng)(以下簡稱安全監(jiān)控系統(tǒng)),該系統(tǒng)可實(shí)現(xiàn)各礦瓦斯數(shù)據(jù)的上傳;還有一個(gè)短信平臺(tái)系統(tǒng),兩個(gè)系統(tǒng)使用的都是SQL SERVER數(shù)據(jù)庫,部署在不同的服務(wù)器上?,F(xiàn)在想要實(shí)現(xiàn)安全監(jiān)控系統(tǒng)中若瓦斯數(shù)據(jù)上傳中斷則自動(dòng)給指定的手機(jī)發(fā)送短信,短信要寫明瓦斯中斷煤礦名稱及中斷時(shí)間和中斷情況。
安全監(jiān)控系統(tǒng)中有一張表“實(shí)時(shí)通訊匯總顯示”,為各礦通訊狀態(tài)實(shí)時(shí)顯示,結(jié)構(gòu)如下:
字段名 字段類型 說明
礦名 Char(20)
狀態(tài) Int(4) 正常狀態(tài)為“1”,服務(wù)器中斷則為“0”
時(shí)間 Datetime(8)
網(wǎng)絡(luò)狀態(tài) Int(4) 正常狀態(tài)為“1”,服務(wù)器中斷則為“-1”
匯總時(shí)間 Datetime(8)
短信平臺(tái)系統(tǒng)可以指定的手機(jī)發(fā)送短信,短信發(fā)送程序是每隔一定的時(shí)間對(duì)表sm_sms進(jìn)行一次掃描,若表sm_sms里有內(nèi)容,再根據(jù)接收人的手機(jī)號(hào)向外進(jìn)行發(fā)送,同時(shí)把已發(fā)送的記錄自動(dòng)插入到表sm_smsoutlog中。若接收用戶回復(fù)短消息,則系統(tǒng)自動(dòng)把回復(fù)的內(nèi)容插入到表sm_smsin中,因此,只需要把要發(fā)送的內(nèi)容按照表的結(jié)構(gòu)插入到sm_sms表中即可,這樣,短信即可正常發(fā)送出去。
短信平臺(tái)系統(tǒng)中表sm_sms的結(jié)構(gòu)如下:
字段名 字段類型 說明
lsh Int(4) ?NOT NULL 插入的記錄編號(hào)
nr Varchar(200) ?NOT NULL 發(fā)送內(nèi)容
jssjh Char(15) ?NOT NULL 接收手機(jī)號(hào)
jrrq Smalldatetime(4) ?YES 接收日期
fsrq Smalldatetime(4) ?YES 發(fā)送日期
fsbz Char(2) ?NOT NULL 發(fā)送標(biāo)志(插入時(shí),一定要置“否”字)
ly Char(16) ?YES 可為NULL
實(shí)現(xiàn)方法:
根據(jù)情況,此數(shù)據(jù)寫入量不大但是有偶發(fā)性即不是定期寫入,擬通過觸發(fā)器來實(shí)現(xiàn)。在安全監(jiān)控系統(tǒng)中的“實(shí)時(shí)通訊匯總顯示”表中做一觸發(fā)器,要求“實(shí)時(shí)通訊匯總顯示”表一旦有礦的狀態(tài)和網(wǎng)絡(luò)狀態(tài)出現(xiàn)中斷的情況即朝短信平臺(tái)系統(tǒng)中的sm_sms表中插入一條記錄,以實(shí)現(xiàn)瓦斯中斷即發(fā)送短信的功能。
首先應(yīng)該使兩個(gè)異地的數(shù)據(jù)庫建立聯(lián)接,在安全監(jiān)控系統(tǒng)服務(wù)器上的SQL Server數(shù)據(jù)庫中,在“安全性”-“鏈接服務(wù)器”中新建一個(gè)名為“KYSMS”的遠(yuǎn)程服務(wù)器鏈接,指向短信平臺(tái)服務(wù)器,如圖1所示。
在“常規(guī)”選項(xiàng)卡中,數(shù)據(jù)源選擇“其它數(shù)據(jù)源”中的“Microsoft OLE DB Provider for SQL Server”,然后在下面的“數(shù)據(jù)源”輸入框中填入短信平臺(tái)服務(wù)器的IP地址,在“目錄”輸入框中輸入sm_sms表所在的數(shù)據(jù)庫名稱,如圖2所示。
在“安全性”選項(xiàng)卡中,“本地登陸”填本地服務(wù)器SQL Server數(shù)據(jù)庫的用戶名,“遠(yuǎn)程用戶”和“遠(yuǎn)程密碼”中分別填寫短信平臺(tái)服務(wù)器的SQL Server數(shù)據(jù)庫的用戶名和登陸密碼。然后選擇“用此安全上下文進(jìn)行:”,并且在下面的“遠(yuǎn)程用戶”和“遠(yuǎn)程密碼”中分別填寫短信平臺(tái)服務(wù)器的SQL Server數(shù)據(jù)庫的用戶名和登陸密碼,如圖3所示。
最后一步,在“服務(wù)器選項(xiàng)”卡中,選中“RPC”和“RPC輸出”這兩項(xiàng),默認(rèn)的只選中了“數(shù)據(jù)訪問”和“使用遠(yuǎn)程排序規(guī)則”這兩項(xiàng),也就是說一共要選中四項(xiàng),如圖4所示。
然后點(diǎn)擊確定,至此遠(yuǎn)程數(shù)據(jù)庫聯(lián)接建立完畢。
接下來我們?cè)龠M(jìn)行另一步更為重要的步驟:制作觸發(fā)器
找到我們要制作觸發(fā)器的表,即瓦斯上傳服務(wù)器中的“實(shí)時(shí)通訊匯總顯示”表,在該表上單擊右鍵,選擇“所有任務(wù)”-“管理觸發(fā)器”,如圖5所示。
在“文本”框中輸入觸發(fā)器內(nèi)容,如圖6所示。
觸發(fā)器中的文本內(nèi)容如下:
CREATE trigger 實(shí)時(shí)通訊中斷觸發(fā)器1
on 實(shí)時(shí)通訊匯總顯示
FOR INSERT UPDATE
as
declare @礦名 char(20),@狀態(tài) int,@時(shí)間 datetime,@網(wǎng)絡(luò)狀態(tài) int,@匯總時(shí)間 datetime
begin
set @礦名= (select [礦名] from Inserted )
set @狀態(tài)= (select [狀態(tài)] from Inserted )
set @時(shí)間= (select [時(shí)間] from Inserted )
set @網(wǎng)絡(luò)狀態(tài)= (select [網(wǎng)絡(luò)狀態(tài)] from Inserted )
set @匯總時(shí)間= (select [匯總時(shí)間] from Inserted )
if (@狀態(tài) = 0 or @網(wǎng)絡(luò)狀態(tài) = -1)
begin
set XACT_ABORT ON
insert into KYSMS.kysms.dbo.sm_sms([lsh],[nr],[jssjh],[fsbz]) values(193753,[‘+ltrim(@礦名)+]+通訊中斷,+服務(wù)器狀態(tài):+cast(ltrim(@狀態(tài)) as char(2))+,+網(wǎng)絡(luò)狀態(tài):+cast(ltrim(@網(wǎng)絡(luò)狀態(tài)) as char(2))+,+時(shí)間:+cast(ltrim(@時(shí)間) as char(18)),134********,否)
insert into KYSMS.kysms.dbo.sm_sms([lsh],[nr],[jssjh],[fsbz]) values(193754,[‘+ltrim(@礦名)+]+通訊中斷,+服務(wù)器狀態(tài):+cast(ltrim(@狀態(tài)) as char(2))+,+網(wǎng)絡(luò)狀態(tài):+cast(ltrim(@網(wǎng)絡(luò)狀態(tài)) as char(2))+,+時(shí)間:+cast(ltrim(@時(shí)間) as char(18)),133********,否)
insert into KYSMS.kysms.dbo.sm_sms([lsh],[nr],[jssjh],[fsbz]) values(193755,[‘+ltrim(@礦名)+]+通訊中斷,+服務(wù)器狀態(tài):+cast(ltrim(@狀態(tài)) as char(2))+,+網(wǎng)絡(luò)狀態(tài):+cast(ltrim(@網(wǎng)絡(luò)狀態(tài)) as char(2))+,+時(shí)間:+cast(ltrim(@時(shí)間) as char(18)),189********,否)
set XACT_ABORT OFF
end
end
說明:
1.declare @礦名 char(20),@狀態(tài) int,@時(shí)間 datetime,@網(wǎng)絡(luò)狀態(tài) int,@匯總時(shí)間 datetime 這一句定義變量。
2.set @礦名= (select [礦名] from Inserted )
……
set @匯總時(shí)間= (select [匯總時(shí)間] from Inserted )設(shè)置變量名。
3.SET XACT_ABORT 為 ON 時(shí),如果執(zhí)行 Transact-SQL 語句產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,則整個(gè)事務(wù)將終止并回滾。
4.insert into KYSMS.kysms.dbo.sm_sms(...)中,“KYSMS.kysms.dbo.sm_sms”用于聯(lián)接遠(yuǎn)程SQL Server數(shù)據(jù)庫中的表sm_sms,其中第一個(gè)KYSMS指我們前面建立的數(shù)據(jù)庫聯(lián)接(為便于區(qū)分也可以起其他名字),第二個(gè)kysms指sm_sms表所在的數(shù)據(jù)庫名。對(duì)應(yīng)每一個(gè)手機(jī)號(hào)寫一條insert插入語句。
設(shè)置該觸發(fā)器之后,如果遇到瓦斯數(shù)據(jù)上傳中斷,則指定的手機(jī)會(huì)收到一條內(nèi)容為:“[某礦]通訊中斷,服務(wù)器狀態(tài):0(或1),網(wǎng)絡(luò)狀態(tài):-1(或1),時(shí)間:** * **** *:**AM(或PM)”的短信。
通過使用觸發(fā)器,實(shí)現(xiàn)了煤礦瓦斯數(shù)據(jù)上傳中斷時(shí)及時(shí)通過手機(jī)短信提醒的功能。瓦斯作為大多數(shù)煤礦事故的元兇其數(shù)據(jù)值極為重要,通過此功能的實(shí)現(xiàn)可以使相關(guān)人員在第一時(shí)間掌握到影響煤礦安全生產(chǎn)的瓦斯數(shù)據(jù)上傳中斷的情況,及時(shí)發(fā)現(xiàn)及時(shí)處理,為信息化提升安全生產(chǎn)提供了堅(jiān)實(shí)的保證。
參考文獻(xiàn)
[1]Jiawei Han.數(shù)據(jù)挖掘:概念與技術(shù)(原書第3版)[M].機(jī)械工業(yè)出版社,2012.
[2]賽奎春.SQL Server數(shù)據(jù)庫開發(fā)實(shí)例解析[M].機(jī)械工業(yè)出版社,2006.
[3]德萊尼.深入解析SQL Server 2008[M].人民郵電出版社,2009.
[4]趙輝,陸冷飛.SQL Server觸發(fā)器在保持?jǐn)?shù)據(jù)庫完整性中的應(yīng)用[J].電腦開發(fā)與應(yīng)用,2007.
[5]魏錦茂.SQL觸發(fā)器在數(shù)據(jù)庫設(shè)計(jì)中的應(yīng)用[J].電腦編程技巧與維護(hù),2010.
[6]黃汛,程治剛.數(shù)據(jù)庫連接池技術(shù)的應(yīng)用研究[N].武漢大學(xué)學(xué)報(bào)(工學(xué)版),2002.
[7]俞建,張燎軍.數(shù)據(jù)庫訪問技術(shù)研究[J].計(jì)算機(jī)與現(xiàn)代化,2004.