觸發器實現跨庫同步(存儲過程同步)

觸發器實現跨庫同步

 


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

有數據 
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 

--插入數據測試 
insert into test 
select 1,'aa' 
union all select 2,'bb' 
union all select 3,'c' 
union all select 4,'dd' 
union all select 5,'ab' 
union all select 6,'bc' 
union all select 7,'ddd' 

--刪除數據測試 
delete from test where id in(1,4,6) 

--更新數據測試 
update test set name=name+'_123' where id in(3,5) 

--顯示測試的結果 
select * from test a full join 
openrowset('sqloledb','xz';'sa';'',test.dbo.test) b on a.id=b.id

 

如何實現兩個數據庫的同步 

利用數據庫複製技術 實現數據同步更新 

複製的概念 
複製是將一組數據從一個數據源拷貝到多個數據源的技術,是將一份數據發佈到多個存儲站點上的有效方式。使用複製技術,用戶可以將一份數據發佈到多臺服務器上,從而使不同的服務器用戶都可以在權限的許可的範圍內共享這份數據。複製技術可以確保分佈在不同地點的數據自動同步更新,從而保證數據的一致性。 

SQL複製的基本元素包括 
出版服務器、訂閱服務器、分發服務器、出版物、文章 

SQL複製的工作原理 
SQL SERVER 主要採用出版物、訂閱的方式來處理複製。源數據所在的服務器是出版服務器,負責發表數據。出版服務器把要發表的數據的所有改變情況的拷貝複製到分發服務器,分發服務器包含有一個分發數據庫,可接收數據的所有改變,並保存這些改變,再把這些改變分發給訂閱服務器 

SQL SERVER複製技術類型,三種複製技術,分別是: 
1、快照複製(呆會我們就使用這個) 
2、事務複製 
3、合併複製 

只要把上面這些概念弄清楚了那麼對複製也就有了一定的理解。接下來我們就一步一步來實現複製的步驟。 
第一先來配置出版服務器 
(1)選中指定[服務器]節點 
(2)從[工具]下拉菜單的[複製]子菜單中選擇[發佈、訂閱服務器和分發]命令 
(3)系統彈出一個對話框點[下一步]然後看着提示一直操作到完成。 
(4)當完成了出版服務器的設置以後系統會爲該服務器的樹形結構中添加一個複製監視器。同時也生成一個分發數據庫(distribution) 

第二創建出版物 
(1)選中指定的服務器 
(2)從[工具]菜單的[複製]子菜單中選擇[創建和管理髮布]命令。此時系統會彈出一個對話框 
(3)選擇要創建出版物的數據庫,然後單擊[創建發佈] 
(4)在[創建發佈嚮導]的提示對話框中單擊[下一步]系統就會彈出一個對話框。對話框上的內容是複製的三個類型。我們現在選第一個也就是默認的快照發布(其他兩個大家可以去看看幫助) 
(5)單擊[下一步]系統要求指定可以訂閱該發佈的數據庫服務器類型,SQLSERVER允許在不同的數據庫如 ORACLE或ACCESS之間進行數據複製。但是在這裏我們選擇運行"SQL SERVER 2000"的數據庫服務器 
(6)單擊[下一步]系統就彈出一個定義文章的對話框也就是選擇要出版的表 
(7)然後[下一步]直到操作完成。當完成出版物的創建後創建出版物的數據庫也就變成了一個共享數據庫。 

第三設計訂閱 
(1)選中指定的訂閱服務器 
(2)從[工具]下拉菜單中選擇[複製]子菜單的[請求訂閱] 
(3)按照單擊[下一步]操作直到系統會提示檢查SQL SERVER代理服務的運行狀態,執行復制操作的前提條件是SQL SERVER代理服務必須已經啓動。 
(4)單擊[完成]。完成訂閱操作。 
完成上面的步驟其實複製也就是成功了。但是如何來知道複製是否成功了呢? 
這裏可以通過這種方法來快速看是否成功。 
展開出版服務器下面的複製——發佈內容——右鍵發佈內容——屬性——擊活——狀態然後點立即運行代理程序接着點代理程序屬性擊活調度 
把調度設置爲每一天發生,每一分鐘,在0:00:00和23:59:59之間。 
接下來就是判斷複製是否成功了打 
開C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database下面 
看是不是有一些以時間做爲文件名的文件夾差不多一分中就產生一個。 
要是你還不信的話就打開你的數據庫看在訂閱的服務器的指定訂閱數據庫下看是不是看到了你剛纔所發佈的表 


/***************** 常見問題:權限問題 

啓動代理的域用戶賬號必須具有讀取發佈-分發服務器目錄的權限 
你用的賬號沒有讀取\\ServerA\D$\Program Files\Microsoft SQL Server\MSSQL\repldata\unc\這個目錄下的文件的權限。 


啓動代理的域用戶賬號必須具有讀取發佈-分發服務器目錄的權限 
----^^^^^^^^^^^^^^^在控制面板-->管理-->服務-->sqlagent-->屬性裏的那個啓動用戶

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