转贴-触发器同步更新远程数据库
事件描述:
一大型煤炭企业,下属十多个矿,有一瓦斯数据上传系统和一个短信平台系统,两个系统用的都是SQL SERVER数据库,但是布署在不同的服务器上。现在想要实现如果瓦斯数据上传中断则自动给指定的手机发送短信,短信要写明矿名及中断时间和中断情况。
瓦斯数据上传系统中有一张表“实时通讯汇总显示”,为各矿通讯状态实时显示,结构如下:
字段名 | 字段类型 | 说明 |
矿名 | Char(20) | |
状态 | Int(4) | 正常状态为“1”,服务器中断则为“0” |
时间 | Datetime(8) | |
网络状态 | Int(4) | 正常状态为“1”,服务器中断则为“-1” |
汇总时间 | Datetime(8) |
短信平台系统可以指定的手机发送短信,短信发送程序是每隔一定的时间对表sm_sms进行一次扫描,若表sm_sms里有内容,再根据接收人的手机号向外进行发送,同时把已发送的记录自动插入到表sm_smsoutlog中。若接收用户回复短消息,则系统自动把回复的内容插入到表sm_smsin中,因此,只需要把要发送的内容按照表的结构插入到sm_sms表中即可,这样,短信即可正常发送出去。
短信平台系统中表sm_sms的结构如下:
字段名 | 字段类型 | 说明 |
lsh | Int(4) NOT NULL | 插入的记录编号 |
nr | Varchar(200) NOT NULL | 发送内容 |
jssjh | Char(15) NOT NULL | 接收手机号 |
jrrq | Smalldatetime(4) YES | 接收日期 |
fsrq | Smalldatetime(4) YES | 发送日期 |
fsbz | Char(2) NOT NULL | 发送标志(插入时,一定要置“否”字) |
ly | Char(16) YES | 可为NULL |
现根据要求,在瓦斯数据上传系统中的“实时通讯汇总显示”表中做一触发器,要求“实时通讯汇总显示”表一旦有矿的状态和网络状态出现中断的情况即朝短信平台系统中的sm_sms表中插入一条记录,以实现瓦斯中断即发送短信的功能。
首先应该使两个异地的数据库建立联接,在瓦斯数据上传系统服务器上的SQL Server数据库中,在“安全性”-“链接服务器”中新建一个名为“KYSMS”的远程服务器链接,指向短信平台服务器:
在“常规”选项卡中,数据源选择“其它数据源”中的“Microsoft OLE DB Provider for SQL Server”,然后在下面的“数据源”输入框中填入短信平台服务器的IP地址,在“目录”输入框中sm_sms表所在的数据库名称,如下图:
在“安全性”选项卡中,“本地登陆”填本地服务器SQL Server数据库的用户名,“远程用户”和“远程密码”中分别填写短信平台服务器的SQL Server数据库的用户名和登陆密码。然后选择“用此安全上下文进行:”,并且在下面的“远程用户”和“远程密码”中分别填写短信平台服务器的SQL Server数据库的用户名和登陆密码。如下图:
最后一步,在“服务器选项”卡中,选中“RPC”和“RPC输出”这两项,默认的只选中了“数据访问”和“使用远程排序规则”这两项,也就是说一共要选中四项,如下图:
然后点击确定,至此远程数据库联接建立完毕。
接下来我们再进行另一步更为重要的步骤:制作触发器
找到我们要制作触发器的表,即瓦斯上传服务器中的“实时通讯汇总显示”表,在该表上单击右键,选择“所有任务”-“管理触发器”,如下图:
在“文本”框中输入触发器内容:
具体内容如下:
CREATE trigger 实时通讯中断触发器1
on 实时通讯汇总显示
FOR INSERT UPDATE
as
declare @矿名 char(20),@状态 int,@时间 datetime,@网络状态 int,@汇总时间 datetime
begin
set @矿名= (select [矿名] from Inserted )
set @状态= (select [状态] from Inserted )
set @时间= (select [时间] from Inserted )
set @网络状态= (select [网络状态] from Inserted )
set @汇总时间= (select [汇总时间] from Inserted )
if (@状态 = 0 or @网络状态 = -1)
begin
set XACT_ABORT ON
insert into KYSMS.kysms.dbo.sm_sms([lsh],[nr],[jssjh],[fsbz]) values(193753,'['+ltrim(@矿名)+']'+'通讯中断,'+'服务器状态:'+cast(ltrim(@状态) as char(2))+','+'网络状态:'+cast(ltrim(@网络状态) as char(2))+','+'时间:'+cast(ltrim(@时间) as char(18)),'134********','否')
insert into KYSMS.kysms.dbo.sm_sms([lsh],[nr],[jssjh],[fsbz]) values(193754,'['+ltrim(@矿名)+']'+'通讯中断,'+'服务器状态:'+cast(ltrim(@状态) as char(2))+','+'网络状态:'+cast(ltrim(@网络状态) as char(2))+','+'时间:'+cast(ltrim(@时间) as char(18)),'133********','否')
insert into KYSMS.kysms.dbo.sm_sms([lsh],[nr],[jssjh],[fsbz]) values(193755,'['+ltrim(@矿名)+']'+'通讯中断,'+'服务器状态:'+cast(ltrim(@状态) as char(2))+','+'网络状态:'+cast(ltrim(@网络状态) as char(2))+','+'时间:'+cast(ltrim(@时间) as char(18)),'189********','否')
set XACT_ABORT OFF
end
end
原文:https://blog.csdn.net/sayesan/article/details/79651737