从 CLR 函数备份数据库

本文关键字:数据库 备份 函数 CLR | 更新日期: 2023-09-27 18:36:36

我正在尝试使用简单的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,级别 16,状态 1,第 1 行执行用户定义的例程或聚合"BackupDb"期间发生 .NET Framework 错误: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) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at UserDefinedFunctions.BackupDb()

从 CLR 函数备份数据库

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

如果你想要一些东西:a)可以进入SQL Server,b)允许你编写c#代码,c)让你对数据库进行更改,那么符合该定义的唯一对象是CLR存储过程。