关于将数据表中的内容从一台主机上传输到另一台主机上的疑问

zhouliang0806 2010-12-24 09:56:30
目前,在做的项目中,需要将一台主机上表中的数据传输到另一台机器上。之间通信的协议为TCP/IP协议,有什么好的方法提醒我一下,或者有类似的例子可以参考。等待大神点拨
...全文
117 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouliang0806 2010-12-24
  • 打赏
  • 举报
回复
谢谢点拨,我先仔细看看
billpu 2010-12-24
  • 打赏
  • 举报
回复
哦 是定期更新数据要传送过去吧,(也就是说不需要全部表同步?)只要有标识就好办
定义个触发器
设置目标机器的链接服务器
在触发器中写语句
参考
/*
作者:邹建
*/

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

有数据
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
zhouliang0806 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 billpu 的回复:]
http://www.soaspx.com/dotnet/sql/mssql/sql2000/sqlserver2000_20100506_4187.html
随便找了一个 这个是定时运行sql语句其实你也一样
[/Quote]
谢谢指点,但我看了一下与我的想法还是有差别的,这篇文章是对数据库进行定期维护吧。我想实现的是,其中一台机器上的数据是在定期更新的,然后定期的将这些数据传输到另一台主机上,是这样的功能。
billpu 2010-12-24
  • 打赏
  • 举报
回复
http://www.soaspx.com/dotnet/sql/mssql/sql2000/sqlserver2000_20100506_4187.html
随便找了一个 这个是定时运行sql语句其实你也一样
zhouliang0806 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 billpu 的回复:]
是要定期copy?还是数据发生改变时候copy
如果是发生改变的时候copy 可以考虑触发器
如果是定期改变 可以考虑
1 定义dts/ssis包 通过作业调度
2 定义存储过程 通过作业调度
3 复制
反正都要通过作业
[/Quote]
关于这个定期传输的,您所说的使用作业哪儿有比较详细的参考资料。我是菜鸟,这个不懂。。。
billpu 2010-12-24
  • 打赏
  • 举报
回复
是要定期copy?还是数据发生改变时候copy
如果是发生改变的时候copy 可以考虑触发器
如果是定期改变 可以考虑
1 定义dts/ssis包 通过作业调度
2 定义存储过程 通过作业调度
3 复制
反正都要通过作业
zhouliang0806 2010-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dali88888 的回复:]
只有SQL SERVER 中的一张表吗???
一张表,,触发器
[/Quote]
不止一张表,是个连续的过程,其中一台主机上的表是随着时间不断产生的,然后发送到另一台主机上
dali88888 2010-12-24
  • 打赏
  • 举报
回复
只有SQL SERVER 中的一张表吗???
一张表,,触发器
dla001 2010-12-24
  • 打赏
  • 举报
回复
1.写个job,定期拉数据到另一个数据库
2.使用replication功能 (复制订阅功能)

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧