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), --备份的目录路径
@ispassword INT, --是否加密压缩文件 1:表示加密,0:表示不加密 默认不加密
@password VARCHAR(16), --解压密码
@output VARCHAR(100) 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 sysdatabases
WHERE [name] = @database
)
BEGIN
/* 文件夹路径判断 */
SET @rarcmd = 'dir ' + @database_dir
CREATE TABLE #t
(
[output] VARCHAR(100)
)
INSERT INTO #t
EXEC xp_cmdshell @rarcmd -- 执行cmdshell命令,查找路径并把结果插入#t表
IF EXISTS(
SELECT *
FROM #t
WHERE [output] LIKE '%找不到%'
)--找不到路径就创建路径
BEGIN
SET @rarcmd = 'md ' + @database_dir
EXEC xp_cmdshell @rarcmd --- 执行cmdshell命令,创建路径
END
SET @rarcmd = 'dir ' + @database_dir ---- 再次判断文件路径是否创建成功(成功的路径不能在系统路径中)
DELETE #t
INSERT INTO #t
EXEC 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 @ispassword = 1 --- rar加密处理
BEGIN
SET @rarcmd = 'C:\Progra1\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:\progra1\WinRAR\WinRAR.exe a -df -ep1 ' + @rarfile
+ ' ' + @bakfile
END
/* 备份模块 */
EXEC MASTER..xp_cmdshell @rarcmd --执行cmdshell命令,压缩备份文件
END
ELSE
BEGIN
SELECT @output = '备份失败:没有这个数据库'
END
GO
DECLARE @rt VARCHAR(100)
EXEC database_backup 'QQ_data', 'D:1\', 1, '2', @rt OUTPUT
SELECT @rt AS 执行结果
GO
--sp_helptext database_backup
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), --备份的目录路径
@ispassword INT, --是否加密压缩文件 1:表示加密,0:表示不加密 默认不加密
@password VARCHAR(16), --解压密码
@output VARCHAR(100) 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 sysdatabases
WHERE [name] = @database
)
BEGIN
/* 文件夹路径判断 */
SET @rarcmd = 'dir ' + @database_dir
CREATE TABLE #t
(
[output] VARCHAR(100)
)
INSERT INTO #t
EXEC xp_cmdshell @rarcmd -- 执行cmdshell命令,查找路径并把结果插入#t表
IF EXISTS(
SELECT *
FROM #t
WHERE [output] LIKE '%找不到%'
)--找不到路径就创建路径
BEGIN
SET @rarcmd = 'md ' + @database_dir
EXEC xp_cmdshell @rarcmd --- 执行cmdshell命令,创建路径
END
SET @rarcmd = 'dir ' + @database_dir ---- 再次判断文件路径是否创建成功(成功的路径不能在系统路径中)
DELETE #t
INSERT INTO #t
EXEC 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 @ispassword = 1 --- rar加密处理
BEGIN
SET @rarcmd = 'C:\Progra1\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:\progra1\WinRAR\WinRAR.exe a -df -ep1 ' + @rarfile
+ ' ' + @bakfile
END
/* 备份模块 */
EXEC MASTER..xp_cmdshell @rarcmd --执行cmdshell命令,压缩备份文件
END
ELSE
BEGIN
SELECT @output = '备份失败:没有这个数据库'
END
GO
DECLARE @rt VARCHAR(100)
EXEC database_backup 'QQ_data', 'D:1\', 1, '2', @rt OUTPUT
SELECT @rt AS 执行结果
GO
--sp_helptext database_backup