SQL兩個資料庫 觸發器(轉

2021-09-01 22:20:02 字數 3985 閱讀 5617

有兩個伺服器,分別裝有兩個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

資料庫觸發器

觸發器是一種特殊型別的儲存過程,它不同於我們前面介紹過的儲存過程。觸發器主要是通過事件進行觸發而被執行的,而儲存過程可以通過儲存過程名字而 被直接呼叫。當對某一表進行諸如update insert delete 這些操作時,sql server 就會自動執行觸發器所定義的sql 語句,從而確保對資料...

資料庫觸發器

最近做了個觸發器的例子 create trigger tru user on user for update asif update status begin update user set stopflag 1 from inserted where user.userid inserted.us...

資料庫 觸發器

觸發器的概念 是使用者定義在關係表上的一類有事件驅動的特殊過程。一旦定義,任何對錶的增刪改操作均有伺服器自動啟用相應的觸發器,在dbms核心層進行集中的完整性控制。類似於約束,但比約束更靈活。觸發器的分類 dml觸發器 dml data manipulation language 觸發器是當資料庫伺...