数据库复制

原创 2003年12月29日 17:29:00

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


/*--数据库数据复制

 将一个数据库中的数据复制到另一个数据库
 如果某列在目标数据库中为标识列,将不会被复制

 适用范围:数据库结构发生了变化,想将旧数据库进行升级
  这样就可以根据新的数据库结构创建一个空库,然后
  将旧数据库的所有数据复制到新库中

--邹建 2003.10(引用请保留此信息)--*/

/*--调用示例

 exec p_copydb 'bns_aa','bns_new'
 exec p_copydb 'acc_五医','acc_演示数据8'
--*/
create proc p_copydb
@o_dbname sysname,  --要复制数据的数据库--源数据库
@n_dbname sysname  --接收数据的数据库--目标数据库
as
declare @sql nvarchar(4000)

--禁用约束/触发器,防止复制时的数据冲突
set @sql='declare #tbc cursor for select name
 from '+@n_dbname+'..sysobjects where xtype=''U'' and status>=0'
exec(@sql)

declare @tbname sysname
open #tbc
fetch next from #tbc into @tbname
while @@fetch_status=0
begin
 set @sql='alter table '+@n_dbname+'..['+@tbname+'] NOCHECK CONSTRAINT ALL'
 exec(@sql)
 set @sql='alter table '+@n_dbname+'..['+@tbname+'] disable trigger ALL'
 exec(@sql)
 fetch next from #tbc into @tbname
end
close #tbc

--复制数据
declare @sql1 varchar(8000)
set @sql='declare #tb cursor for select a.name from '
 +@o_dbname+'..sysobjects a inner join '
 +@n_dbname+'..sysobjects b on a.name=b.name
  where a.xtype=''U'' and b.xtype=''U'''
exec(@sql)
open #tb
fetch next from #tb into @tbname
while @@fetch_status=0
begin
 select @sql1=''
  ,@sql='select @sql1=@sql1+'',[''+a.name+'']'' from(
  select name from '+@o_dbname+'..syscolumns where id in
  (select id from '+@o_dbname+'..sysobjects where name='''+@tbname+''')
 ) a inner join (
  select name from '+@n_dbname+'..syscolumns where status<>0x80 and id in
  (select id from '+@n_dbname+'..sysobjects where name='''+@tbname+''')
 ) b on a.name=b.name'
 exec sp_executesql @sql,N'@sql1 nvarchar(4000) out',@sql1 out

 select @sql1=substring(@sql1,2,8000)
 exec('insert into '+@n_dbname+'..['+@tbname+']('+@sql1
  +') select '+@sql1+' from '+@o_dbname+'..['+@tbname+']')
 if @@error<>0
  print('insert into '+@n_dbname+'..['+@tbname+']('+@sql1
   +') select '+@sql1+' from '+@o_dbname+'..['+@tbname+']')
 fetch next from #tb into @tbname
end
close #tb
deallocate #tb

--数据复制完成后启用约束
open #tbc
fetch next from #tbc into @tbname
while @@fetch_status=0
begin
 set @sql='alter table '+@n_dbname+'..['+@tbname+'] CHECK CONSTRAINT ALL'
 exec(@sql)
 set @sql='alter table '+@n_dbname+'..['+@tbname+'] enable trigger ALL'
 exec(@sql)
 fetch next from #tbc into @tbname
end
close #tbc
deallocate #tbc
go

相关文章推荐

sql server数据库复制改名

  • 2015年08月11日 14:58
  • 18KB
  • 下载

oracle数据库文件移动(复制)另一个目录(主机)上重新启动的方法

如何更改oracle9i数据文件、日志文件和控制文件的存储路径? 分类: Oracle2011-03-21 11:22 715人阅读 评论(0) 收藏 举报 oracle存储数据库...
  • haiross
  • haiross
  • 2013年10月17日 17:10
  • 2446

Oracle 11G RMAN复制数据库(Linux版)

  • 2013年11月12日 22:10
  • 4.76MB
  • 下载

利用dbLink技术 可以进行数据库复制(及如何调整表顺序)

导入的命令是:imp 用户名/密码@网络服务名 file=xxx.dmp full=y; 例子:开始->运行->输入cmd->imp PECARD_HN/PECARD_HN@127.0.0.1:15...

mongodb那些事–复制数据库和表

总结, 数据表的复制 db.runCommand({cloneCollection:”commit.daxue”,from:”198.61.104.31:27017″}); 数据库的复制 db.c...

RMAN高级应用之Duplicate复制数据库

  • 2008年01月26日 11:48
  • 286KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库复制
举报原因:
原因补充:

(最多只允许输入30个字)