杰文

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

 

posted @ 2010-03-13 10:02  曾祥展  阅读(406)  评论(0编辑  收藏  举报