• 通过CLR存储过程删除过期的数据库Bak备份文件


     在一个备份文件目录DataBaseBak下,有各个数据库的完全、差异、事务备份文件,结构式:
    ------DataBaseBak
       ┖---实例名
            ┖---数据库名
                 ┖---备份日期(包含完全、差异、事务备份文件)

    现在想实现删除某一日期之前过期不用的备份文件。

    Use Test
    GO
    --设置CLR选项,指定MS SQL Server可以运行用户程序集
    Exec sp_configure N'clr enabled',1
    Go
    Reconfigure
    Go

    /*
    使用模拟上下文的数据库模块(例如,用户定义函数或存储过程)可以访问数据库以外的资源。

    开启这一选项是因为,在这实例中需要访问System.IO类库。
    */
    Alter Database Test Set Trustworthy On
    Go

    --创建托管应用程序模块

    If object_id('sp_DeleteFiles'Is Not Null
        
    Drop Proc sp_DeleteFiles
    Go
    If Exists(Select 1 From sys.assemblies Where Name=N'CLRDeleteFiles')
        
    Drop Assembly CLRDeleteFiles
    Go
    Create Assembly CLRDeleteFiles
        
    From N'F:\Study\Objects\ClassLibrary1\ClassLibrary1\bin\Debug\CLRDeleteFiles.dll' With Permission_set=External_Access
    Go
    --创建CLR存储过程
    Create Proc sp_DeleteFiles
    (
        
    @FilePath nvarchar(128),
        
    @LastWriteTimeStart datetime,
        
    @LastWriteTImeEnd datetime
    )
    As
        External Name CLRDeleteFiles.CLRDeleteFiles.DelFiles
    Go

    --执行
    Exec sp_DeleteFiles 'F:\Test','19000101','20091201'

     CLRDeleteFiles.dll  C#代码:


    using System;
    using System.Data;
    using Microsoft.SqlServer.Server;
    using System.IO;

    public class CLRDeleteFiles
    {
        [Microsoft.SqlServer.Server.SqlProcedure] 
    //表示该方法标记为存储过程
        public static void DelFiles(string FilePath, DateTime LastWriteTimeStart,DateTime LastWriteTimeEnd)
        {
            Boolean PrintFlag 
    = false;

            
    if (FilePath=="")
            {
                SendMsg(
    "文件路径不能为空!");
                
    return;
            }

            
    try
            {
                DirectoryInfo FileDir 
    = new DirectoryInfo(FilePath);

                
    if (!FileDir.Exists)
                {
                    SendMsg(
    "无效的文件路径!");
                    
    return;
                }

                
    //这里只查寻后缀名为"*.bak"的数据库备份文件
                
    //SearchOption.AllDirectories 表明检索所有的子目录
                foreach (FileInfo myFile in FileDir.GetFiles("*.bak",SearchOption.AllDirectories))
                {
                    
    if (myFile.LastWriteTime >= LastWriteTimeStart && myFile.LastWriteTime <= LastWriteTimeEnd)
                    {
                        
    if (PrintFlag == false)
                        {
                            SendMsg(
    "\n文件目录: " + FilePath);
                            PrintFlag 
    = true;
                        }

                        SendMsg(
    "已删除文件: " +myFile.FullName);

                        myFile.Delete();
                    }
                }
            }
            
    catch (Exception e)
            {

                SendMsg(e.ToString());
            }
            
        }
        
    //信息提示过程
        private  static void SendMsg(string Msg)
        {
            SqlContext.Pipe.Send(Msg);
        }
    }
  • 相关阅读:
    iOS堆栈-内存-代码在据算机中的运行
    iOS self和super的区别
    php代码优化
    缓存雪崩现象解决方案
    缓存失效
    分布式memcache
    Linux下编译安装Memcache
    windows 下安装 php-memcached 扩展
    Linux下安装 php-memcache 扩展
    缓存之文件缓存
  • 原文地址:https://www.cnblogs.com/wghao/p/1603557.html
Copyright © 2020-2023  润新知