SQLSERVER触发器实现跨库同步(转)
SQLSERVER触发器实现跨库同步(转)/*--同步两个数据库的⽰例
有数据
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,lphone
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,lphone
from srv2.库名.dbo.author b,author i
where b.id=i.id and
(b.name<>i.name lphone<&lphone)
--插⼊新增的数据
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服务
p_cmdshell 'isql /S"xz" /U"sa" /P"" /q"p_cmdshell ''net start msdtc'',no_output"',no_output
--启动本机的MSDTC服务
p_cmdshell 'net start msdtc',no_output
--进⾏分布事务处理,如果表⽤标识列做主键,⽤下⾯的⽅法
BEGIN DISTRIBUTED TRANSACTION
delete from openrowset('sqloledb','xz';'sa';'',st)
where id in(select id from deleted)
insert into openrowset('sqloledb','xz';'sa';'',st)
select*from inserted
commit tran
go
--插⼊数据测试
insert into test
select1,'aa'
union all select2,'bb'
union all select3,'c'
union all select4,'dd'
union all select5,'ab'
union all select6,'bc'
union all select7,'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';'',st) 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-->属性⾥的那个启动⽤户

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。