从CLR函数备份数据库

时间:2013-10-23 10:31:50

标签: c# sql-server-2012 clr

我试图使用简单的CLR函数来备份sql数据库。

[SqlFunction(DataAccess = DataAccessKind.Read)]
public static int BackupDb()
{
    using (var conn = new SqlConnection("context connection=true"))
    {
        conn.Open();
        var cmd = new SqlCommand(
            @"backup database MyDatabase to disk='d:\temp\MyDatabase.bak' WITH INIT, STATS=10", conn);
        cmd.ExecuteNonQuery();
    }
    return 0;
}

但是这段代码给出了异常 Msg 6522,Level 16,State 1,Line 1 执行用户定义的例程或聚合期间发生.NET Framework错误" BackupDb": System.Data.SqlClient.SqlException:无效使用副作用运算符' BACKUP DATABASE'在一个函数内。 System.Data.SqlClient.SqlException:    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception,Boolean breakConnection,Action 1 wrapCloseInAction) at System.Data.SqlClient.SqlCommand.RunExecuteNonQuerySmi(Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 completion,String methodName,Boolean sendToPipe,Int32 timeout,Boolean asyncWrite)    在System.Data.SqlClient.SqlCommand.ExecuteNonQuery()    在UserDefinedFunctions.BackupDb()

1 个答案:

答案 0 :(得分:1)

您无法在函数中更改数据库。就这么简单。备份数据库确实会对该数据库进行更改(特别是它如何处理事务日志的各个部分)

如果你想要a)可以进入SQL Server,b)允许你编写c#代码,c)让你对数据库进行更改,那个符合该定义的唯一对象是CLR Stored Procedure < / p>