代码之家  ›  专栏  ›  技术社区  ›  Milos

从CLR函数备份数据库

  •  0
  • Milos  · 技术社区  · 12 年前

    我正在尝试使用简单的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;
    }
    

    但这个代码给出了例外 消息6522,级别16,状态1,第1行 在执行用户定义例程或聚合“BackupDb”期间发生.NET Framework错误: System.Data.SqlClient.SqlException:函数中无效使用了副作用运算符“BACKUP DATABASE”。 系统数据.SqlClient.SqlException: 位于System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection,操作 1 wrapCloseInAction) at System.Data.SqlClient.SqlCommand.RunExecuteNonQuerySmi(Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1完成,String methodName,布尔sendToPipe,Int32超时,布尔asyncWrite) 位于System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 位于UserDefinedFunctions.BackupDb()

    1 回复  |  直到 12 年前
        1
  •  1
  •   Damien_The_Unbeliever    12 年前

    不能在函数内对数据库进行更改。就这么简单。备份数据库确实会对该数据库进行更改(尤其是它如何处理事务日志的部分)

    如果您想要a)可以进入SQL Server内部的东西,b)允许您编写c#代码,c)允许您对数据库进行更改,那么唯一符合该定义的对象是 CLR Stored Procedure