sql2000数据库备份压缩存储+压缩密码

use master
go
if exists(select * from sysobjects where [type]='FN' and [name]='kymp_时间转字符')
begin
drop function kymp_时间转字符
end
go
create function kymp_时间转字符
(
@date datetime,  --时间
@type varchar(10)   --类型
)
returns varchar(4)
with encryption
as
begin
declare @retdate varchar(4),@today datetime
set @retdate=''
select @retdate=case rtrim(ltrim(@type)) when 'yy' then
  cast(Year(@date) as varchar(4))  --取年份
 when 'mm' then       --取月份
  case when month(@date)>9  then cast(month(@date) as varchar(2))     
    else '0'+cast(month(@date) as varchar(2)) end
 when 'dd' then       --取天数
  case when day(@date)>9  then cast(day(@date) as varchar(2))     
    else '0'+cast(day(@date) as varchar(2)) end
 when 'hh' then       --取小时
  case when datepart(hh,@date)>9 then cast(datepart(hh,@date) as varchar(2))
   else '0'+cast(datepart(hh,@date) as varchar(2))
  end
 when 'nn' then        --取分
  case when datepart(mi,@date)>9 then cast(datepart(mi,@date) as varchar(2))
   else '0'+cast(datepart(mi,@date) as varchar(2))
  end
 when 'ss' then       --取秒
  case when datepart(ss,@date)>9 then cast(datepart(ss,@date) as varchar(2))
   else '0'+cast(datepart(ss,@date) as varchar(2))
  end
 else
  ''
 end
return @retdate
end
go

--select dbo.kymp_时间转字符(getdate(),'ss')

go
if exists(select * from sysobjects where [type]='P' and [name]='database_backup')
begin
drop procedure database_backup
end
go
CREATE procedure database_backup
@database varchar(1000),     --要备份的数据库名称
@database_dir varchar(1000), --备份的目录路径
@israr int,      --是否加压  1:压缩,0:不压缩
@ispassword int,    --是否加密压缩文件 1:表示加密,0:表示不加密 默认不加密
@password varchar(16),       --解压密码
@output varchar(100)  output, --返回结果
@outname varchar(1000) output -- 返回备份文件名
--  WITH ENCRYPTION
AS
 
declare
@datefile nvarchar(1000),  -- 备份数据库的全名:数据库名+时间
@bakfile nvarchar(1000),   -- 备份文件名  加.bak后缀
@rarfile nvarchar(1000),   -- 压缩文件名
@rarcmd nvarchar(1000)     -- shell字符命令
select @database as 数据库名称,@database_dir as 备份路径,case @ispassword when 1 then '加密' when 0 then '不加密' end as 是否加密,@password as 压缩密码

/*    对各个参数的判断      */
-- 判断数据库
if (@database is null) or (@database ='')
begin
select @output='备份失败:数据库不能为空'
return
end
-- 判断数据库

----   判断密码
if @ispassword is null 
begin
set @ispassword=0
end
else if @ispassword =1  --- 如果要加密文件,必须给出加密密码
begin
 if (@password is null) or (@password ='')
 begin
  set @output ='备份失败:如果要给压缩的备份文件加密,密码不能为空'
  return
 end
end
----   判断密码

 

---- 判断路径
if (@database_dir is null) or (@database_dir ='')
begin
 set @output='备份失败:备份文件路径不能为空'
 return
end
---- 判断路径

/*    对各个参数的判断      */


if exists(select * from master.dbo.sysdatabases where [name]=@database)
begin
 /*  文件夹路径判断   */
 set @rarcmd='dir ' + @database_dir
 create table #t([output] varchar(100))
 insert into #t exec master.dbo.xp_cmdshell @rarcmd    -- 执行cmdshell命令,查找路径并把结果插入#t表
 if exists(select * from #t where [output] like '%找不到%')--找不到路径就创建路径
 begin
  set @rarcmd='md ' + @database_dir
  exec master.dbo.xp_cmdshell @rarcmd    --- 执行cmdshell命令,创建路径
 end 
 set @rarcmd='dir ' + @database_dir  ---- 再次判断文件路径是否创建成功(成功的路径不能在系统路径中)
 delete #t
 insert into #t exec master.dbo.xp_cmdshell  @rarcmd --- 执行命令
 if exists(select * from #t     -- 备份路径不能在系统路径中
  where ([output] like '%找不到%') or ([output] like '%system32%'))
 begin
  drop table #t
  set @output='备份失败:传入的文件夹路径不对'
  return
 end
 drop table #t
 /*  文件夹路径判断   */

 /*   备份模块    select getdate()*/

--备份文件名  数据库名+系统当前时间+.bak
 set @datefile=@database+ '_backup_'+dbo.kymp_时间转字符(getdate(),'yy')+dbo.kymp_时间转字符(getdate(),'mm')+dbo.kymp_时间转字符(getdate(),'dd')
    +dbo.kymp_时间转字符(getdate(),'hh')+dbo.kymp_时间转字符(getdate(),'nn')+dbo.kymp_时间转字符(getdate(),'ss')
 set @bakfile=@database_dir+@datefile+'.bak'
 set @rarfile=@database_dir+''+@datefile+'.rar'  --- 压缩的rar文件
 BACKUP DataBASE @database TO DISK = @bakfile WITH INIT , NOUNLOAD , NAME = N'HR数据备份', NOSKIP , STATS = 10, NOFORMAT
 if @israr=1
 begin
  if @ispassword = 1  ---  rar加密处理
  begin
   set @rarcmd ='C:/Progra~1/WinRAR/WinRAR.exe a  -p'+ @password + ' -df -ep1 '+@rarfile+' '+@bakfile
   set @output ='备份成功:已加密压缩备份文件,密码是:'+@password
  end
  else if @ispassword=0   --- rar不加密处理
  begin
   set @output ='备份成功:以不加密的方式压缩了备份文件'
   set @rarcmd='C:/progra~1/WinRAR/WinRAR.exe a  -df -ep1 '+@rarfile+' '+@bakfile
  end
 /*  备份模块  */

  set @outname=@rarfile
  exec master.dbo.xp_cmdshell @rarcmd   --执行cmdshell命令,压缩备份文件
 end
 else
 begin
  set @outname=@bakfile
  set @output='不压缩备份了数据'
 end
end
else
begin
 select @output='备份失败:没有这个数据库'
end
go

declare @rt varchar(100),@name varchar(100),@sql_cmd varchar(1000)
exec database_backup 'web2005','D:/1/',0,1,'2',@rt output,@name output
select @rt  as 执行结果,@name as 文件名
--select right(@name,len(@name)-charindex('/',@name))
--set @sql_cmd='exec xp_cmdshell '''+'copy '+@name+' D:/2/'+right(@name,len(@name)-charindex('eedsmis',@name)+1)+''''
--select @sql_cmd
--exec(@sql_cmd)
go
--sp_helptext database_backup

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值