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