通过触发器实现数据库的即时同步方案
一、实现目的
为了实现不同数据库表之间的数据即时同步更新,采用触发器事务处理,可以保证数据更新的安全性和同步性。
二、实现步骤
假设本地数据库服务器为A,远程数据库服务器为B
1、 首先要开通本地数据库服务器和远程数据库服务器的MSDTC服务,可以手工开通,也可以通过程序进行开通,如下:
--------------------------------------------
远程:EXEC
master..xp_cmdshell 'isql /S"A" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start
本地:EXEC
master..xp_cmdshell 'net start msdtc',no_output
--------------------------------------------
2、 在A建立远程数据库的ODBC连接,如下:
--------------------------------------------
USE master
GO
EXEC sp_addlinkedserver
'SvrTest', --SvrTest为链接服务器名称
'',
'MSDASQL',
NULL,
NULL,
'DRIVER={SQL Server};SERVER=B;UID=sa;PWD=;'
--UID为可以访问目标数据库的用户帐号
GO
--------------------------------------------
EXEC
sp_serveroption ' SvrTest
', 'rpc', 'TRUE' --启用RPC
EXEC
sp_serveroption ' SvrTest
', 'rpc out', 'TRUE' --启用RPC
--------------------------------------------
3、 可以写您需要的触发器来操作远程数据库表,这里有三种方式
①、OpenQuery(Linked Server,’query’) -- Linked Server就是上面所设置的SvrTest,query为具体的SQL操作语句
②、OpenRowSet('provider_name',{'datasource' ; 'user_id' ; 'password'| 'provider_string' }, { [ catalog.] [ schema.] object | 'query' })
具体例子为:delete from openrowset('sqloledb','xz';'sa';'',test.dbo.test)
where id in(select id from deleted)
③、如果是操作远程数据库的存储过程,则不可以用上面的两个方法,可以直接调用链接服务器名.数据库名.dbo.存储过程名,这个方式也可以直接用于表的调用。
三、实例演示
下面以A(远程数据源)和B(本地数据源)机器为例,实现通过B的DataBase2数据库的Web_RegInfo表的插入触发器来即时同步更新A的DataBase1的Corinfo表和ProductReg表:
1、确认开通A和B的MDDTC是否开通。
2、在B开通A的ODBC连接:
3、在B上的DataBase2数据库的Web_RegInfo表写插入触发器,如下:
4、 插入数据库测试和显示测试结果
四、其它补充说明