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