动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ SQL技巧 ]的信息

本月文章推荐
.如何将图片存到数据库中?.
.sql2000挂起无法安装的问题.
.在设计数据库时如何选择正确的数.
.SQL Server 2000中生成XML的小技.
.SQL中也可以用格式字符串定制日期.
.讲解SQL Server数据库被挂马的解.
.SQL Server 2005使用基于行版本控.
.微软需要改进SQL Server的六大功.
.放弃连接消息出现在错误日志中的.
.MS SQL用ROWCOUNT解决TOP子句不支.
.SQL Server轻松掌握如何删除群集.
.SQL Server 2000的安全配置.
.两台SQLServer数据同步解决方案(.
.在控制中心点选数据库时出现的SQ.
.深入探讨数据仓库设计的步骤 禁忌.
.两表(多表)关联update的写法.
.数据仓库基本报表制作过程中的SQ.
.SQL Server2000数据库文件损坏时.
.SQL Server补丁安装常见问题.
.实例讲解分区表的可用性及相关错.

MS SQL数据库备份和恢复存储过程(加强版本)

发表日期:2007-2-11 |


先将代码发布出来,大家共享。
如有发现BUG,请大家指教或EMAIL:aierong@vip.sina.com
/**//*备份数据库*/
create proc pr_backup_db
@flag varchar(20) out,
@backup_db_name varchar(128),
@filename varchar(1000)  --路径+文件名字
as
declare @sql nvarchar(4000),@par nvarchar(1000)
if not exists(
 select * from master..sysdatabases
  where name=@backup_db_name
  )
begin
 select @flag='db not exist'  /**//*数据库不存在*/
 return
end
else
begin
 if right(@filename,1)<>'' and charindex('',@filename)<>0
 begin
  select @par='@filename varchar(1000)'
  select @sql='BACKUP DATABASE '+@backup_db_name
                         +' to disk=@filename with init'
  execute sp_executesql @sql,@par,@filename
  select @flag='ok'
  return
 end
 else
 begin
  select @flag='file type error'  /**//*参数@filename输入格式错误*/
  return
 end
end

GO


 

/**//*创建函数,得到文件得路径*/
create function fn_GetFilePath(@filename nvarchar(260))
returns nvarchar(260)  
as
begin
 declare @file_path nvarchar(260)
 declare @filename_reverse nvarchar(260)
 select @filename_reverse=reverse(@filename)
 select @file_path=substring(@filename,1,len(@filename)+1-charindex('',@filename_reverse))
 return @file_path
end


GO

 

 


/**//*恢复数据库*/
CREATE  proc pr_restore_db   
/**//*
------------------------------------------------
Create Time:    2004-03-20
Update Time:    2004-03-29 11:05
Author:         aierong
Remark:         恢复数据库
 
------------------------------------------------
*/
/**//*过程运行的状态标志,是输入参数*/     
@flag varchar(20) out,   
/**//*要恢复的数据名字*/
@restore_db_name nvarchar(128),
/**//*备份文件存放的路径+备份文件名字*/
@filename nvarchar(260)        
as
/**//*返回系统存储过程xp_cmdshell运行结果*/
declare @proc_result tinyint
/**//*循环次数*/
declare @loop_time smallint 
/**//*@tem表的ids列最大数*/
declare @max_ids smallint   
/**//*原数据库存放路径*/
declare @file_bak_path nvarchar(260) 
/**//*文件存放标志*/
declare @flag_file bit  
/**//*数据库master文件路径*/
declare @master_path nvarchar(260) 
declare @sql nvarchar(4000),@par nvarchar(1000)
declare @sql_sub nvarchar(4000)
declare @sql_cmd nvarchar(100)
declare @sql_kill nvarchar(100)
/**//*
判断参数@filename文件格式合法性,以防止用户输入类似d: 或者 c:a 等非法文件名
参数@filename里面必须有''并且不以''结尾
*/
if right(@filename,1)<>'' and charindex('',@filename)<>0
begin
 select @sql_cmd='dir '+@filename
 EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
 /**//*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
 IF (@proc_result<>0) 
 begin
  /**//*备份文件不存在*/
  select @flag='not exist'  
  /**//*退出过程*/
  return 
 end
 /**//*创建临时表,保存由备份集内包含的数据库和日志文件列表组成的结果集*/
 create table #tem(
     /**//*文件的逻辑名称*/
     LogicalName nvarchar(128),
     /**//*文件的物理名称或操作系统名称*/
     PhysicalName nvarchar(260) ,
            /**//*数据文件 (D) 或日志文件 (L)*/
     Type char(1), 
     /**//*包含文件的文件组名称*/
     FileGroupName nvarchar(128),
                          /**//*当前大小(以字节为单位)*/
     [Size] numeric(20,0), 
     /**//*允许的最大大小(以字节为单位)*/
     [MaxSize] numeric(20,0) 
   )
 /**//*
 创建表变量,表结构与临时表基本一样
 就是多了两列,
 列ids(自增编号列),
 列file_path,存放文件的路径
 */
 declare @tem table(      
     /**//*自增编号列*/
     ids smallint identity, 
     LogicalName nvarchar(128),
     PhysicalName nvarchar(260),
     File_path nvarchar(260),
     Type char(1), 
     FileGroupName nvarchar(128)
   )
 insert into #tem
  execute('restore filelistonly from disk='''+@filename+'''')
 /**//*将临时表导入表变量中,并且计算出相应得路径*/ http://www.knowsky.com/
 insert into @tem(LogicalName,PhysicalName,File_path,Type,FileGroupName) 
  select LogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName
   from #tem
 if @@rowcount>0
 begin
  drop table #tem
 end
 select @loop_time=1
 /**//*@tem表的ids列最大数*/
 select @max_ids=max(ids) 
  from @tem
 while @loop_time<=@max_ids
 begin
  select @file_bak_path=file_path
   from @tem where ids=@loop_time
  select @sql_cmd='dir '+@file_bak_path
  EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
  /**//*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
  IF (@proc_result<>0)
   select @loop_time=@loop_time+1 
  else
   /**//*没有找到备份前数据文件原有存放路径,退出循环*/
   BREAK
 end
 select @master_path=''
 if @loop_time>@max_ids
  /**//*备份前数据文件原有存放路径存在*/
  select @flag_file=1  
 else
 begin
  /**//*备份前数据文件原有存放路径不存在*/
  select @flag_file=0 
  select @master_path=dbo.fn_GetFilePath(filename)
   from master..sysdatabases
   where name='master'
 end
 select @sql_sub=''
 /**//*type='d'是数据文件,type='l'是日志文件 */
 /**//*@flag_file=1时新的数据库文件还是存放在原来路径,否则存放路径和master数据库路径一样*/
 select @sql_sub=@sql_sub+'move '''+LogicalName+''' to '''
   +case type
         when 'd' then case @flag_file
             when 1 then  File_path
      else @master_path
          end   
         when 'l' then case  @flag_file
      when 1 then  File_path
      else @master_path
          end   
   end
   +case type
    when 'd' then @restore_db_name
           +'_DATA'
           /**//*给文件编号*/
           +convert(sysname,ids) 
           +'.'
           /**//*给文件加入后缀名,mdf or ndf*/
           +right(PhysicalName,3) 
           +''',' 
    when 'l' then @restore_db_name
           +'_LOG'
           /**//*给文件编号*/
           +convert(sysname,ids)  
           +'.'
           /**//*给文件加入后缀名,mdf or ndf*/
           +right(PhysicalName,3) 
           +''',' 
    end
   from @tem
 select @sql='RESTORE DATABASE @db_name '
                        +'FROM DISK=@filename with '
 select @sql=@sql+@sql_sub+'replace'
 select @par='@db_name nvarchar(128),@filename nvarchar(260)'
 /**//*关闭相关进程,把相应进程状况导入临时表中*/
 select identity(int,1,1) ids, spid
  into #temp
  from master..sysprocesses
  where dbid=db_id(@restore_db_name)
 /**//*找到相应进程*/
 if @@rowcount>0
 begin  
  select @max_ids=max(ids)
   from #temp
  select @loop_time=1
  while @loop_time<=@max_ids
  begin
   select @sql_kill='kill '+convert(nvarchar(20),spid)
    from #temp
    where ids=@loop_time
   execute sp_executesql @sql_kill
   select @loop_time=@loop_time+1
  end
 end
 drop table #temp
 execute sp_executesql @sql,
                                      @par,
                                      @db_name=@restore_db_name,
                                      @filename=@filename
 /**//*操作成功*/
 select @flag='ok'  
end
else
begin
 /**//*参数@filename输入格式错误*/
 SELECT @flag='file type error' 
end


GO

 


/*运行*/

--备份数据库test_database
declare @fl varchar(10)
execute pr_backup_db @fl out,'test_database','c:\test_database.bak'
select @fl

--恢复数据库,输入的参数错误
declare @fl varchar(20)
exec pr_restore_db @fl out,'sa','c:\'
select @fl


--恢复数据库,即创建数据库test_database的复本test_db
declare @fl varchar(20)
exec pr_restore_db @fl out,'test_db','c:\test_database.bak'
select @fl


 具体可以看
http://dev.csdn.net/article/28/28463.shtm

上一篇:教你如何用SQL备份和还原数据库 人气:5671
下一篇:如何取得sql server数据库表中各字段的描述 人气:4378
浏览全部SQL数据库备份的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-12 team论坛 v2.0.4 bulid 080916 A
2008-10-12 Roclog v3.1.6
2008-10-12 SupeV v1.0.1 简体中文 GBK
2008-10-12 NetCMS v1.6.0.1010 正式版
2008-10-12 PHP考试系统PPFrame v1.2.7
2008-10-12 LPAS个人相册 v1.6.3
2008-10-12 快问仿百度知道系统 动态-静态-互
2008-10-12 方卡广告防点击系统 V1.0 GB2312
2008-10-12 泡菜内容管理系统[PCMS] v1.0 Bu
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成