设为首页 收藏本站
查看: 979|回复: 0

[经验分享] sql server 复制数据库 存储过程

[复制链接]

尚未签到

发表于 2018-10-12 10:51:31 | 显示全部楼层 |阅读模式
  /*-- 在 SQLServer 中使用SQLDMO.Transfer 实现数据迁移
  存储过程实现源数据库到目标数据库的对象和数据的复制
  要求源数据库和目标数据库在同一服务器
  如果是要实现不同服务器之间的复制,则需要增加验证信息
  --邹建 2005.07(引用请保留此信息)--*/
  /*--调用示例

  >  EXEC P_CopyDB @Source_DB='northwind',@Des_DB='test'
  DROP DATABASE test
  --*/
  CREATE PROCEDURE P_CopyDB
  @Des_DB      sysname,           --目标数据库
  @Obj_Type    nvarchar(4000)=N'',--复制的对象类型,可以是下列字符串列表:
  -- O 所有对象,D 默认值,R 规则,P 存储过程
  -- T 表,TR 触发器,DT 用户定义数据类型
  -- V 视图,DATA 数据,DEL 删除目标对象
  @Source_DB   sysname=N'',       --源数据库
  @ServerName  sysname=N'',       --服务器名
  @UserName    sysname=N'',       --用户名,不指定则表示使用 Windows 身份登录
  @pwd         sysname=N''        --密码
  AS
  SET NOCOUNT ON
  DECLARE @srvid int,@Dbid int,@S_dbid int,@D_dbid int,@TransferID int,
  @err int,@src varchar(255), @desc varchar(255)
  IF ISNULL(@ServerName,N'')=N'' SET @ServerName=@@SERVERNAME
  IF ISNULL(@Source_DB,N'')=N'' SET @Source_DB=DB_NAME()
  --创建sqldmo对象·
  EXEC @err=sp_oacreate 'sqldmo.sqlserver',@srvid OUT
  IF @err0 GOTO lb_Err
  --连接服务器
  IF ISNULL(@UserName,N'')=N'' --使用 Windows 身份登录
  BEGIN
  EXEC @err=sp_oasetproperty @srvid,'loginsecure',-1
  IF @err0 GOTO lb_Err
  EXEC @err=sp_oamethod @srvid,'connect',NULL,@servername
  END
  ELSE
  EXEC @err=sp_oamethod @srvid,'connect',NULL,@servername,@UserName,@pwd
  IF @err0 GOTO lb_Err
  --获取数据库集
  EXEC @err=sp_oagetproperty @srvid,'databases',@Dbid OUT
  IF @err0 GOTO lb_Err
  --选择源数据库
  EXEC @err=sp_oamethod @Dbid,'item',@S_dbid OUT,@Source_DB
  IF @err0 GOTO lb_Err
  --选择目标数据库
  EXEC @err=sp_oamethod @Dbid,'item',@D_dbid OUT,@Des_DB
  IF @err0 GOTO lb_Err
  --设置复制的对象
  EXEC @err=sp_oacreate 'SQLDMO.Transfer',@TransferID OUT
  IF @err0 GOTO lb_Err
  --设置目标服务器信息
  EXEC @err=sp_oasetproperty  @TransferID,'DestServer',@ServerName
  IF @err0 GOTO lb_Err
  --设置连接用户
  IF ISNULL(@UserName,N'')=N'' --使用 Windows 身份登录
  BEGIN
  EXEC @err=sp_oasetproperty @TransferID,'DestUseTrustedConnection',1
  IF @err0 GOTO lb_Err
  END
  ELSE
  BEGIN
  EXEC @err=sp_oasetproperty @TransferID,'DestLogin',@UserName
  IF @err0 GOTO lb_Err
  EXEC @err=sp_oasetproperty @TransferID,'DestPassword',@pwd
  IF @err0 GOTO lb_Err
  END
  --设置复制对象信息
  EXEC @err=sp_oasetproperty @TransferID,'DestDatabase',@Des_DB
  IF @err0 GOTO lb_Err
  DECLARE tb CURSOR FAST_FORWARD LOCAL
  FOR
  SELECT Name FROM(
  SELECT KeyWord=N',D,',   Name=N'CopyAllDefaults' UNION ALL
  SELECT KeyWord=N',O,',   Name=N'CopyAllObjects' UNION ALL
  SELECT KeyWord=N',R,',   Name=N'CopyAllRules' UNION ALL
  SELECT KeyWord=N',P,',   Name=N'CopyAllStoredProcedures' UNION ALL
  SELECT KeyWord=N',T,',   Name=N'CopyAllTables' UNION ALL
  SELECT KeyWord=N',TR,',  Name=N'CopyAllTriggers' UNION ALL
  SELECT KeyWord=N',DT,',  Name=N'CopyAllUserDefinedDatatypes' UNION ALL
  SELECT KeyWord=N',V,',   Name=N'CopyAllViews' UNION ALL
  SELECT KeyWord=N',DATA,',Name=N'CopyData' UNION ALL
  SELECT KeyWord=N',DEL,', Name=N'DropDestObjectsFirst'
  )A WHERE CHARINDEX(KeyWord,
  CASE WHEN ISNULL(@Obj_Type,N'')='' THEN ',O,DATA,' ELSE @Obj_Type END)>0
  OPEN tb
  FETCH tb INTO @src
  WHILE @@FETCH_STATUS=0
  BEGIN
  EXEC @err=sp_oasetproperty @TransferID,@src,1
  IF @err0 GOTO lb_Err
  FETCH tb INTO @src
  END
  CLOSE tb
  DEALLOCATE tb
  --复制对象
  EXEC @err=sp_oamethod @S_dbid,'Transfer',null,@TransferID
  IF @err0 GOTO lb_Err
  --结束
  SET @err=0
  GOTO lb_Exit
  --错误处理
  lb_Err:
  EXEC sp_oageterrorinfo NULL, @src OUT, @desc OUT
  RAISERROR(N'错误编号 %#x, 错误源 "%s", 错误描述 "%s"',16,1,@err,@src,@desc)
  RETURN -1
  lb_Exit:
  EXEC sp_OADestroy @Dbid
  EXEC sp_OADestroy @srvid
  EXEC sp_OADestroy @TransferID
  RETURN @err
  GO


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-620690-1-1.html 上篇帖子: SQL Server 表自增字段归零 下篇帖子: SQL Server 中各个系统表的作用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表