數據庫同步(網上資料收藏)

有兩個服務器,分別裝有兩個SQL Server A ,B
A,B的表結構a,b 相同
A,B分別都會做一些INSERT,UPDATE,DELETE操作,要求AB的數據保持一致
(即A新增一條數據,要求B也新增,A更改一條數據,B也更改相應的)
是不是可以用觸發器來實現
那位高手給個例程  
/*
作者:鄒建
*/

/*--同步兩個數據庫的示例

有數據
srv1.庫名..author有字段:id,name,phone,
srv2.庫名..author有字段:id,name,telphone,adress

要求:
srv1.庫名..author增加記錄則srv1.庫名..author記錄增加
srv1.庫名..author的phone字段更新,則srv1.庫名..author對應字段telphone更新
--*/

--大致的處理步驟
--1.在 srv1 上創建連接服務器,以便在 srv1 中操作 srv2,實現同步
exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql實例名或ip'
exec sp_addlinkedsrvlogin 'srv2','false',null,'用戶名','密碼'
go

--2.在 srv1 和 srv2 這兩臺電腦中,啓動 msdtc(分佈式事務處理服務),並且設置爲自動啓動
我的電腦--控制面板--管理工具--服務--右鍵 Distributed Transaction Coordinator--屬性--啓動--並將啓動類型設置爲自動啓動
go


--3.實現同步處理

--a.在srv1..author中創建觸發器,實現數據即時同步
--新增同步
create trigger tr_insert_author on author
for insert
as
set xact_abort on
insert srv2.庫名.dbo.author(id,name,telphone)
select id,name,telphone from inserted
go

--修改同步
create trigger tr_update_author on author
for update
as
set xact_abort on
update b set name=i.name,telphone=i.telphone
from srv2.庫名.dbo.author b,inserted i
where b.id=i.id
go

--刪除同步
create trigger tr_delete_author on author
for delete
as
set xact_abort on
delete b
from srv2.庫名.dbo.author b,deleted d
where b.id=d.id
go



--3.實現同步處理的方法2,定時同步

--在srv1中創建如下的同步處理存儲過程
create proc p_process
as
--更新修改過的數據
update b set name=i.name,telphone=i.telphone
from srv2.庫名.dbo.author b,author i
where b.id=i.id and
(b.name<>i.name or b.telphone<>i.telphone)

--插入新增的數據
insert srv2.庫名.dbo.author(id,name,telphone)
select id,name,telphone from author i
where not exists(
select * from srv2.庫名.dbo.author where id=i.id)

--刪除已經刪除的數據(如果需要的話)
delete b
from srv2.庫名.dbo.author b
where not exists(
select * from author where id=b.id)
go



--然後創建一個作業定時調用上面的同步處理存儲過程就行了

企業管理器
--管理
--SQL Server代理
--右鍵作業
--新建作業
--"常規"項中輸入作業名稱
--"步驟"項
--新建
--"步驟名"中輸入步驟名
--"類型"中選擇"Transact-SQL 腳本(TSQL)"
--"數據庫"選擇執行命令的數據庫
--"命令"中輸入要執行的語句: exec p_process
--確定
--"調度"項
--新建調度
--"名稱"中輸入調度名稱
--"調度類型"中選擇你的作業執行安排
--如果選擇"反覆出現"
--點"更改"來設置你的時間安排


然後將SQL Agent服務啓動,並設置爲自動啓動,否則你的作業不會被執行

設置方法:
我的電腦--控制面板--管理工具--服務--右鍵 SQLSERVERAGENT--屬性--啓動類型--選擇"自動啓動"--確定.



上面寫了兩種同步方法,實際使用時,只需要其中任意一種就行了

如果數據庫在同一實例中,則只需要同步處理的部分,並且將處理語句中涉及到的服務器名去掉,即只要:

庫名.dbo.表名   

如果只是簡單的數據同步,可以用觸發器來實現.下面是例子:

--測試環境:SQL2000,遠程主機名:xz,用戶名:sa,密碼:無,數據庫名:test

--創建測試表,不能用標識列做主鍵,因爲不能進行正常更新
--在本機上創建測試表,遠程主機上也要做同樣的建表操作,只是不寫觸發器
if exists (select * from dbo.sysobjects where id = object_id(N'[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [test]

create table test(id int not null constraint PK_test primary key
,name varchar(10))
go

--創建同步的觸發器
create trigger t_test on test
for insert,update,delete
as
set XACT_ABORT on
--啓動遠程服務器的MSDTC服務
exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output

--啓動本機的MSDTC服務
exec master..xp_cmdshell 'net start msdtc',no_output

--進行分佈事務處理,如果表用標識列做主鍵,用下面的方法
BEGIN DISTRIBUTED TRANSACTION
delete from openrowset('sqloledb','xz';'sa';'',test.dbo.test)
where id in(select id from deleted)
insert into openrowset('sqloledb','xz';'sa';'',test.dbo.test)
select * from inserted
commit tran
go

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章