遇到难题了,等待zjcxc(邹建)大哥帮忙~关于过去提出的SQL2000同步的实现问题

wl6179 2010-10-05 11:55:15
拜见各位SQL的前辈,我今天搜索到了邹建大哥过去提出的利用存储过程实现两个数据库SQL2000同步的解决方案,之后原帖上的楼主说是做成功了,可我自己做项目的时候却没能成功,遇到很多问题摸不着头脑,请大侠们帮忙解决啊!!



--以下是根据邹建大哥2004年提供的资料,结合我的实例改编的:-----------------------------


/*--同步两个数据库的示例

有数据字段
srv1.库名..Categories有字段:CategoryID,CategoryName,Description(门禁系统的SQL 2000数据库)
srv2.库名..Categories有字段:CategoryID,CategoryName,Description222(局域网内的另一台主机的SQL 2005数据库,IP为192.168.1.88,SQL服务器名称为WWW-E09CC733B36,数据库名称将为模仿2000自带数据库Northwind所自建的Northwind数据库,里边只有一个测试用的表Categories)

要求:
srv1.库名..Categories增加记录则srv2.库名..Categories记录增加记录;
srv1.库名..Categories的Description字段更新,则srv2.库名..Categories对应字段Description222更新;
--*/

/*--
实验一:
--*/

--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步 :
exec sp_addlinkedserver 'WWW-E09CC733B36','','SQLOLEDB','192.168.1.88'
exec sp_addlinkedsrvlogin 'WWW-E09CC733B36','false',null,'sa','pddas2KKo3000oAAAADDAAKRUICMkjd999'
go


create proc p_process
as
--更新修改过的数据
update b set CategoryName=i.CategoryName,Description222=i.Description
from WWW-E09CC733B36.Northwind.dbo.Categories b,Categories i
where b.CategoryID=i.CategoryID and
(b.CategoryName <> i.CategoryName or b.Description222 <> i.Description)

--插入新增的数据
insert WWW-E09CC733B36.Northwind.dbo.Categories(CategoryID,CategoryName,Description222)
select CategoryID,CategoryName,Description from Categories i
where not exists(
select * from WWW-E09CC733B36.Northwind.dbo.Categories where CategoryID=i.CategoryID)

--删除已经删除的数据(如果需要的话)
delete b
from WWW-E09CC733B36.Northwind.dbo.Categories b
where not exists(
select * from Categories where CategoryID=b.CategoryID)
go

/*--
实验一查询分析器反馈的报错信息是:
--*/

服务器: 消息 15028,级别 16,状态 1,过程 sp_addlinkedserver,行 79
服务器 'WWW-E09CC733B36' 已存在。

(所影响的行数为 0 行)


(所影响的行数为 1 行)


(所影响的行数为 0 行)


(所影响的行数为 1 行)

服务器: 消息 170,级别 15,状态 1,过程 p_process,行 7
第 7 行: '-' 附近有语法错误。















/*--
实验二:
--*/
/*--同步两个数据库的示例

有数据字段
srv1.库名..Categories有字段:CategoryID,CategoryName,Description(门禁系统的SQL 2000数据库)
srv2.库名..Categories有字段:CategoryID,CategoryName,Description222(局域网内的另一台主机的SQL 2005数据库,IP为192.168.1.88,SQL服务器名称为WWW-E09CC733B36,数据库名称将为模仿2000自带数据库Northwind所自建的Northwind数据库,里边只有一个测试用的表Categories)

要求:
srv1.库名..Categories增加记录则srv2.库名..Categories记录增加记录;
srv1.库名..Categories的Description字段更新,则srv2.库名..Categories对应字段Description222更新;
--*/
--(如实验一的环境一样)

--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步
exec sp_addlinkedserver 'svr2','','SQLOLEDB','192.168.1.88'
exec sp_addlinkedsrvlogin 'svr2','false',null,'sa','pddas2KKo3000oAAAADDAAKRUICMkjd999'
go


create proc p_process
as
--更新修改过的数据
update b set CategoryName=i.CategoryName,Description222=i.Description
from svr2.Northwind.dbo.Categories b,Categories i
where b.CategoryID=i.CategoryID and
(b.CategoryName <> i.CategoryName or b.Description222 <> i.Description)

--插入新增的数据
insert svr2.Northwind.dbo.Categories(CategoryID,CategoryName,Description222)
select CategoryID,CategoryName,Description from Categories i
where not exists(
select * from svr2.Northwind.dbo.Categories where CategoryID=i.CategoryID)

--删除已经删除的数据(如果需要的话)
delete b
from svr2.Northwind.dbo.Categories b
where not exists(
select * from Categories where CategoryID=b.CategoryID)
go



/*--
实验二查询分析器反馈的报错信息是:
--*/

(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 0 行)


(所影响的行数为 1 行)


(所影响的行数为 0 行)


(所影响的行数为 1 行)

服务器: 消息 17,级别 16,状态 1,过程 p_process,行 6
SQL Server 不存在或拒绝访问。





为什么我无论用svr2还是用WWW-E09CC733B36都无法实现邹建大哥的经典案例呢?!我搜了很久觉得邹建大哥的这个存储过程方案是最简洁的,希望能够实现出来,请大侠们多多帮忙分析!!
...全文
73 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
chen870201 2010-10-06

学习了!
回复
obuntu 2010-10-06
很明显链接服务器有问题。

先在图形界面操作吧,然后右键测试下。

图形界面建立的链接服务器跟脚本建立的一样。
回复
xiaoxiangqing 2010-10-05
1.链接数据库可以在企业管理器中先设置好
2.再创建存储过程
回复
SQLCenter 2010-10-05
[Quote=引用楼主 wl6179 的回复:]
服务器: 消息 15028,级别 16,状态 1,过程 sp_addlinkedserver,行 79
服务器 'WWW-E09CC733B36' 已存在。
……
服务器: 消息 170,级别 15,状态 1,过程 p_process,行 7
第 7 行: '-' 附近有语法错误。
[/Quote]
服务器 'WWW-E09CC733B36' 已存在。
--
这个你把计算机名用作连接服务器名了吧

第 7 行: '-' 附近有语法错误。
--
[WWW-E09CC733B36]
回复
claro 2010-10-05
我们一直在学习他的精神。

这个脚本有点长!在linux下也不方便检查,等高手帮你。
回复
wl6179 2010-10-05
哈哈,claro大哥在线呀,才几秒钟就回复了。你的思路我明白了,就是我没有T-SQL的功底,只好求助大家,真希望能够想邹建大侠一样路见不平拔刀相助~哈哈

希望各位大力支持本帖,解决数据库同步难题~
回复
claro 2010-10-05
[Quote=引用 13 楼 wl6179 的回复:]
希望这张帖子能够成为数据库同步的经典帖子~
[/Quote]但愿!行动吧!
回复
claro 2010-10-05
到这个环节基本你已经很难判断问题,这时候怎么办?

只能回到开始阶段,从头开始!通常决定做这步很难,但是可能是有效的。

给个建议:
将上述的实现原理和环节,简单化,比如要同步数据库,先做好同步table。要同步talbe,先实现异地库的table读取。
将你需要实现的内容简单到极致后,一步步做,记住了,这里每做一步要实现解决一个问题,比如链接服务器的问题,或者是表权限的问题。明白吗?
说了很多废话,do now!
回复
wl6179 2010-10-05
希望这张帖子能够成为数据库同步的经典帖子~
回复
wl6179 2010-10-05
[Quote=引用 3 楼 xiaoxiangqing 的回复:]
1.链接数据库可以在企业管理器中先设置好
2.再创建存储过程
[/Quote]似乎可以解决链接报错的问题哦,不知道应该如何 在企业管理器中先设置好链接,并且能够在创建存储过程中引用这个链接???期待中……
回复
wl6179 2010-10-05
555~谢谢claro大哥的两篇文章,写的挺好的文章,也感谢大家的热心帮忙,不过我试来试去还是不成功哦~~~
我根据这两篇文章改成了这样:
EXEC sp_addlinkedserver '192.168.1.88' , 'SQL Server'
exec sp_addlinkedsrvlogin '192.168.1.88','false','sa','','pddas2KKo3000oAAAADDAAKRUICMkjd999'


还是出现同样的报错~~没准是哪个很细节的地方没有配置好~


不知道各位有没有已经证实过能够实现同步的例子呢?期待!
回复
ljr_aa 2010-10-05
链接服务器手工做,其它在作业做就可以了。
回复
claro 2010-10-05
我也不知道exec sp_addlinkedserver '[WWW-E09CC733B36]','','SQLOLEDB','192.168.1.88' 语句中,'[WWW-E09CC733B36]'之处究竟应该填写什么才合适,它是不是有什么严格的要求必须填写某种格式的东西呢?总觉得出错就出在这里~

差不多吧,起码你看到问题 了。
exec sp_addlinkedserver '[WWW-E09CC733B36]','','SQLOLEDB','192.168.1.88'

1/ [WWW-E09CC733B36]和'192.168.1.88'是什么关系?
2/ 链接服务器的语句内容错了 。可以参考相关内容,如下:
http://blog.csdn.net/claro/archive/2009/07/03/4317900.aspx

http://blog.csdn.net/claro/archive/2010/08/09/5798156.aspx
回复
wl6179 2010-10-05
也请claro大哥帮忙看看:)
回复
wl6179 2010-10-05
补充:我已经按照过去邹大哥的要求,全都打开启动了SQL SERVER AGENT服务和msdtc(分布式事务处理服务Distributed Transaction Coordinator)了。。。好愁人啊,请几位前辈再帮忙看看~

我也不知道exec sp_addlinkedserver '[WWW-E09CC733B36]','','SQLOLEDB','192.168.1.88' 语句中,'[WWW-E09CC733B36]'之处究竟应该填写什么才合适,它是不是有什么严格的要求必须填写某种格式的东西呢?总觉得出错就出在这里~
回复
wl6179 2010-10-05
这么快就得到大家的回复关心,非常感动啊!
刚才看到SQLCenter大哥说:“这个你把计算机名用作连接服务器名了吧
第 7 行: '-' 附近有语法错误。
[WWW-E09CC733B36]


然后我改好成这样了,还是有报错,请帮我看看我改对了吗:

/*--
实验一:
--*/

--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步 :
exec sp_addlinkedserver '[WWW-E09CC733B36]','','SQLOLEDB','192.168.1.88'
exec sp_addlinkedsrvlogin '[WWW-E09CC733B36]','false',null,'sa','pddas2KKo3000oAAAADDAAKRUICMkjd999'
go


create proc p_process
as
--更新修改过的数据
update b set CategoryName=i.CategoryName,Description222=i.Description
from [WWW-E09CC733B36].Northwind.dbo.Categories b,Categories i
where b.CategoryID=i.CategoryID and
(b.CategoryName <> i.CategoryName or b.Description222 <> i.Description)

--插入新增的数据
insert [WWW-E09CC733B36].Northwind.dbo.Categories(CategoryID,CategoryName,Description222)
select CategoryID,CategoryName,Description from Categories i
where not exists(
select * from [WWW-E09CC733B36].Northwind.dbo.Categories where CategoryID=i.CategoryID)

--删除已经删除的数据(如果需要的话)
delete b
from [WWW-E09CC733B36].Northwind.dbo.Categories b
where not exists(
select * from Categories where CategoryID=b.CategoryID)
go



还是了个报错:

(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 0 行)


(所影响的行数为 1 行)


(所影响的行数为 0 行)


(所影响的行数为 1 行)

服务器: 消息 17,级别 16,状态 1,过程 p_process,行 6
SQL Server 不存在或拒绝访问。
回复
claro 2010-10-05
等邹建的话,去MSDN发贴。
回复
claro 2010-10-05
原因都那几点,一点点找。
2F帮你排除了2个。
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-10-05 11:55
社区公告
暂无公告