复制的整个流程是搞通了,也能够正常进行复制。
但是我有个问题:新建的对象(表、视图、存储过程)的复制不能自动完成,必须要人工干预。
我要管理的数据库有几十个,个数还在不断的增长,如果每个在升级之后,都要人工去干预,
工作量太大,请问大侠们,在复制这种方式下,有没有办法让新增的对象能够自动完成复制呀,
或者是通过sql语句,让其自动完成的,只要不要太多的需要人工一步一步去操作的方式解决,
就可以啦
12 个解决方案
#1
用JOB??作业?
#2
企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:
...............................................
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排为一天一次
然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行
设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
#3
數據庫同步,鏡像.
#4
可以利用触发器同步,在触发器中通过系统表获取数据库中的表、视图等对象,然后同步。
触发器同步参照:
触发器同步参照:
--====================================================
--发布/订阅的效果最好.
--自己写触发器同步的实时性和可控制性最好.
--====================================================
如果只是简单的数据同步,可以用触发器来实现.下面是例子:
--测试环境: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
#5
学习
#6
建立作业
#7
请问楼主,我现在也要用复制,目前流程还没有走通,能介绍一下吗?谢谢。我的情况是:1服务器+n客户端。客户端数据定期向服务器汇总,客户端所用的表都一样,只是添加内容不同,想采用合并复制,不知道如何实现,在建立发布是,提示要加入uniqueidentifier列,这个有影响吗?没有看懂,呵呵。期盼你的回复。
#8
没办法通过sql语句,修改复制这种模式中需要处理的项目吗?
#9
能提供你做的复制的操作步骤吗?我现在想做,正在学习。谢谢!
#10
怎么没有回复啊!
#11
学习
#12
学习
#1
用JOB??作业?
#2
企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:
...............................................
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排为一天一次
然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行
设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
#3
數據庫同步,鏡像.
#4
可以利用触发器同步,在触发器中通过系统表获取数据库中的表、视图等对象,然后同步。
触发器同步参照:
触发器同步参照:
--====================================================
--发布/订阅的效果最好.
--自己写触发器同步的实时性和可控制性最好.
--====================================================
如果只是简单的数据同步,可以用触发器来实现.下面是例子:
--测试环境: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
#5
学习
#6
建立作业
#7
请问楼主,我现在也要用复制,目前流程还没有走通,能介绍一下吗?谢谢。我的情况是:1服务器+n客户端。客户端数据定期向服务器汇总,客户端所用的表都一样,只是添加内容不同,想采用合并复制,不知道如何实现,在建立发布是,提示要加入uniqueidentifier列,这个有影响吗?没有看懂,呵呵。期盼你的回复。
#8
没办法通过sql语句,修改复制这种模式中需要处理的项目吗?
#9
能提供你做的复制的操作步骤吗?我现在想做,正在学习。谢谢!
#10
怎么没有回复啊!
#11
学习
#12
学习