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