通过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);
    }
}

 

 

 

 

 

 

 

 

posted @ 2009-11-15 23:11  ok_008  阅读(953)  评论(2编辑  收藏  举报
给我写信