0

シンプルな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」。System.Data.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(TaskCompletionSource1 完了、文字列 methodName、ブール型 sendToPipe、Int32 タイムアウト、ブール型 asyncWrite) で System.Data.SqlClient.SqlCommand で。 UserDefinedFunctions.BackupDb() の ExecuteNonQuery()

4

1 に答える 1

1

関数内からデータベースを変更することはできません。それはそれと同じくらい簡単です。また、データベースをバックアップすると、そのデータベースが変更されます (特に、トランザクション ログのセクションの処理方法が変更されます)。

a) SQL Server 内に入れることができる、b) C# コードを記述できる、c) データベースに変更を加えることができる何かが必要な場合、その定義に適合する唯一のオブジェクトはCLR ストアド プロシージャです。

于 2013-10-23T11:51:49.433 に答える