CSDN博客

img zhangzs8896

两个数据库间的"复制"

发表于2004/9/27 11:09:00  689人阅读

关于复制,从来没涉及到过,向来是用最笨的方法。今天看了一个帖子,受益非浅,特总结一下 ^_^

方法一:使用企业管理器进行“复制”
             [ 暂时假设:把库My_test中的存储过程,自定义函数,视图,表以及触发器等复制  到My_test_Copy库中]
       1 企业管理器中右键点击My_test_Copy库,选择 所有任务---导入数据。
         按提示进行操作,注意选择好源数据库和目标数据库!
       2 注意下面的选择:
         
注意一下细节部分,就ok了!

方法二:使用sql语句进行复制

--1.在目标服务器上建立如下对象(被同步的服务器)

if exists (select * from dbo.sysobjects where id = object_id(N'[sys_syscomments_bak]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 drop table [sys_syscomments_bak]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_process_object]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
 drop procedure [dbo].[p_process_object]
GO

--创建辅助处理的表
create table sys_syscomments_bak(name sysname,xtype char(2),number smallint,colid smallint,status smallint,ctext varbinary(8000))
go

exec sp_configure 'allow updates',1 reconfigure with override
go

--创建处理的存储过程
create proc p_process_object
as
set xact_abort on
exec sp_configure 'allow updates',1 reconfigure with override
begin tran
 --先删除系统表中的旧记录
 delete a
 from syscomments c,sysobjects o,sys_syscomments_bak ob
 where c.id=o.id
  and o.name=ob.name and o.xtype=ob.xtype

 --再插入新记录到系统表中
 insert syscomments([id],[number],[colid],[status],[ctext])
 select o.[id],ob.[number],ob.[colid],ob.[status],ob.[ctext]
 from sysobjects o,sys_syscomments_bak ob
 where o.name=ob.name and o.xtype=ob.xtype
commit tran

 --重新编译所有的对象
 declare tb cursor local for
 select case
  when xtype='V' then 'exec sp_refreshview '
  else 'sp_recompile' end
  +'['+replace(object_name(id),N']',N']]')+']'''
 from sys_syscomments_bak
 declare @s nvarchar(4000)
 open tb
 fetch tb into @s
 while @@fetch_status=0
 begin
  exec(@s)
  fetch tb into @s
 end
 close tb
 deallocate tb
exec sp_configure 'allow updates',0 reconfigure with override
go

exec sp_configure 'allow updates',0 reconfigure with override
go

--2.在源服务器(提供被同步对象的服务器)

--先创建链接服务器,链接到目标服务器
if exists(select * from master..sysservers where srvname='srv_lnk')
 exec sp_dropserver 'srv_lnk','droplogins'
exec sp_addlinkedserver  'srv_lnk','','SQLOLEDB','目标服务器IP地址'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'登录的用户名','登录密码'
exec sp_serveroption 'srv_lnk','rpc out','true'
go

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_copyobject]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
 drop procedure [dbo].[p_copyobject]
GO

--再创建如下的处理过程来实现同步
create proc p_copyobject
as
 --复制本机对象到目标服务器,注意修改库名为远程目标服务器的库名
 delete from srv_lnk.库名.dbo.sys_syscomments_bak
 insert srv_lnk.库名.dbo.sys_syscomments_bak
  (name,xtype,number,colid,status,ctext)
 select o.name,o.xtype,c.number,c.colid,c.status,c.ctext
 from syscomments c,sysobjects o
 where c.id=o.id
  and o.status>=0
  and o.xtype in('V','P','FN','IF','TF','TR')
 
 --调用远程的存储过程完成最终的复制任务
 exec srv_lnk.库名.dbo.sys_syscomments_bak
go

注:方法2来自
http://community.csdn.net/Expert/topic/3410/3410939.xml?temp=5.967349E-02


阅读全文
0 0

相关文章推荐

img
取 消
img